您的位置:首页 > 编程语言 > C语言/C++

C#网站调用C++非托管dll须知

2013-03-13 10:31 393 查看
今天在asp.net网站中调用C++非托管dll的时候到时候出现"法加载 DLL“dllTest.dll”: 找不到指定的模块。
(异常来自 HRESULT:0x8007007E)。 "的错误

我是把dll放在bin目录下,后来放在与页面同一级目录下还是不行!这就让我郁闷了,因为以前在项目里调用C++ Dll 就像调用API一样把 DLL拷贝到System32下面,直接就

可以调用了,可现在做网站到时候是购买人家的空间不可能让你去写system32目录的,仔细琢磨能不能根据相对路径去调用C++ dll动态库

,试了发多方法都不行,不过后来发现几个要点:

1/ 指定绝对路径是可能调用DLL里面的方法,但最后你根本是不知道网站放哪个目录,所以这个方法肯定不考虑

[DllImport(@"D:\\dllTest.dll")]

2/ 如果用类库(A)去调用 C++ DLL里面方法,然后把该项类库(A)的DLL和C++ DLL同时拷贝到网站bin目录下,保持两个DLL在同一路径下,这样也是可以的,但觉得就为了调用DLL

里的几个方法而专门写个DLL去调用,也不合适!所以后面也没考虑

3/ 还用种就是动态Load(Dll),就是先通过系统API动态去找到该 DDL组件,然后就再去调用里面方法

[DllImport("Kernel32.dll")]

public static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("Kernel32.dll")]

public static extern bool FreeLibrary(IntPtr hModule);

[DllImport("Kernel32.dll")]

public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

private IntPtr myDllHandle = IntPtr.Zero;

public Delegate GetAddress(string functionName, Type t)

{

if (myDllHandle != IntPtr.Zero)

{

IntPtr functionAddr = GetProcAddress(myDllHandle, functionName);

if (functionAddr == IntPtr.Zero)

return null;

else

return Marshal.GetDelegateForFunctionPointer(functionAddr, t);

}

else

return null;

}

public LoadDll(string dllFilePath)

{

myDllHandle = LoadLibrary(dllFilePath);

}

~LoadDll()

{

if (myDllHandle != IntPtr.Zero)

{

FreeLibrary(myDllHandle);

}

myDllHandle = IntPtr.Zero;

}

4/后来发现上面这些方法要么不合理要么太繁琐,后面就发现一种方法可以

把dllTest.dll拷贝到bin目录下,然后发布网站调用是可以的,因为发布后的网站DLL都在bin目录下与dllTest.dll同级所以是可以的

但这种情况是如果直接到vs2005里面调试是不行的,因为调试网站是在vs自带的Web服务器里面运行的,利用的文件是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

这个目录下的临时文件来运行的,但这里没有DLL所以调试是达不到效果的

不过后面有个重大发现就是:如果给网站加个解决方案(*.sln),保持testDll.dll和这个sln文件在同一级目录下,在vs2005调试是可以的,但发布后是不行的
http://space.itpub.net/12639172/viewspace-594314
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: