DLLimport无法加载dll。

8
我正在使用一个未受管理的cpp dll,我从我的C# Web项目中调用它。在我的本地主机上运行良好,但在共享托管winhost上根本不起作用。当我尝试使用dll中的一个函数时发生这种情况。
我得到的错误消息是:
"无法加载DLL'dllTest.dll':应用程序无法启动,因为其并行配置不正确。请参见应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。(HRESULT异常:0x800736B1)","errors":[{"name":"DllNotFoundException","message":"无法加载DLL'dllTest.dll':应用程序无法启动,因为其并行配置不正确。请参见应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。(HRESULT异常:0x800736B1)"}]}
我怀疑这是一个路径问题。所涉及的dll,dllTest.dll放置在我的bin文件夹中。我不确定它在哪里搜索dll,但有没有办法指定搜索dll的路径?我找不到一种指定相对路径的方法。
我不认为这是依赖关系问题,因为我的dllTest.dll只是一个简单的测试,它只包含一个简单的加法函数。
还可能有其他原因吗?
感谢您的帮助。

可能是x86与x64的问题吗?此外,我会在其上运行依赖项检查器,并确保DLL没有缺少其依赖项(尽管这完全是瞎猜)。 - Merlyn Morgan-Graham
1个回答

13
问题在于您的C++ DLL需要安装CRT库才能正常工作。错误消息中加粗的部分是给您提示的地方:
无法加载DLL'dllTest.dll':应用程序无法启动,因为其并行配置不正确。请参阅应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。
这就解释了为什么在开发机器上一切都很好——它们已经安装在那里,因为它们随开发工具一起安装——以及为什么在没有安装CRT可再发行组件的生产服务器上无法工作。
您需要下载适用于编译DLL的Visual Studio版本的适当的可再发行包。例如,如果您使用的是Visual Studio 2010,则可以在此处下载10版本的CRT可再发行包。
另外,您可以将运行时库静态链接到DLL中。要做到这一点,请将项目属性更改为抛出/MT开关而不是/MD——(在UI中找到“配置属性”->“C/C++”->“代码生成”->“运行时库”)。

+1 静态链接是解决问题最简单的方法。 - David Heffernan
谢谢!我正在使用共享主机,所以无法使用CRT可分发文件。我认为静态链接它们解决了问题。然而,我还有另一个问题。我有一个名为subspace.dll的dll文件,它引用了许多其他第三方dll文件。这是否意味着我也必须在/MT中构建它们所有?如果我无法访问其中一些的源代码,我该怎么办? - wayne
1
如果你有多个依赖于VC-Runtime的DLL,最好分发VC运行时。 - Ajay
@wayne:这将完全取决于其他DLL所依赖的内容。但它们中的大多数都需要某种C/C++运行时库,可以静态链接或在机器上加载。没有太多其他选择。安装CRT是常见的路径,奇怪的是您的托管机器竟然没有加载它。 - Cody Gray
这是一个非常令人沮丧的错误信息的典型例子。它们假设你知道他们如何定义“并排配置”,当然你可以去阅读文档,但很难摆脱阅读文档也无济于事的感觉。当然,在这种情况下,他们喜欢让你猜测到底缺少了哪些组件。真是气死人! - PJTraill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接