我没有看到DLLImport中使用的引用中的Dll

时间:2014-01-29 00:23:38

标签: c# c++ dll pinvoke dllimport

我刚刚获得了第三方源代码,它基本上是另一个c ++库的包装项目:

我看到代码如下:

[DllImport("QMSL_MSVC10D.dll", SetLastError = true, CallingConvention=CallingConvention.Cdecl)]
        static extern byte QLIB_SendSync( uint hResourceContext, 
                short requestSize,
                byte [] requestBytes,
                ref short responseSize,
                byte [] responseBytes,
                ulong timeout       
                );

有趣的是,我没有在references文件夹中看到“QMSL_MSVC10D.dll”。他们说它是动态加载但我没有在任何文件夹或引用列表中看到QMSL_MSVC10D.dll。当我调试代码时,错误输出错误:

Unable to load DLL 'QMSL_MSVC10D.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

当我告诉他们这就是发生的事情时,他们告诉我它是动态加载的。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

引用列表只包含程序引用和使用的其他.NET程序集或COM对象,但是您从DllImport调用的任何非托管代码都不会列在那里。正如供应商所说,它是按需动态加载的,并不意味着编译时引用,这就是你没有看到它的原因。

但是,这并不意味着您在运行时不需要.DLL本身。在程序首次调用P / Invoke'd函数时,必须可以访问该文件。看看你有源的地方,他们必须提供第三方库(否则代码是无用的)。典型的做法是将DLL与主.EXE放在一起,以便系统可以轻松找到它们。

如果您将DLL添加到项目中(不作为参考,而是作为“现有文件”),您可以将其Copy to output directory设置为Copy always,以便在编译时始终可以使用它