我刚刚获得了第三方源代码,它基本上是另一个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)
当我告诉他们这就是发生的事情时,他们告诉我它是动态加载的。我错过了什么吗?
答案 0 :(得分:1)
引用列表只包含程序引用和使用的其他.NET程序集或COM对象,但是您从DllImport
调用的任何非托管代码都不会列在那里。正如供应商所说,它是按需动态加载的,并不意味着编译时引用,这就是你没有看到它的原因。
但是,这并不意味着您在运行时不需要.DLL本身。在程序首次调用P / Invoke'd函数时,必须可以访问该文件。看看你有源的地方,他们必须提供第三方库(否则代码是无用的)。典型的做法是将DLL与主.EXE放在一起,以便系统可以轻松找到它们。
如果您将DLL添加到项目中(不作为参考,而是作为“现有文件”),您可以将其Copy to output directory
设置为Copy always
,以便在编译时始终可以使用它