今天在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调试是可以的,但发布后是不行的