无法加载 C++ Vista x64 中 C# 应用程序中的 DLL
我有一个用 C++ 编写的 DLL,需要由 C# 中的应用程序使用。 它在 Vista x86 下运行良好,但在 x64 下无法加载。 因此,我构建了 DLL 的 x64 版本,并检测操作系统是 x86 还是 x64,并对适当的 DLL 使用适当的互操作调用。 这在 Vista x86 下工作正常,但在 Vista x64 下,当它尝试加载 DLL 时,我收到“并排”错误。 到底为什么无法加载它,可以采取什么措施来纠正这个问题? (如果您需要更多信息,请告诉我,我不确定哪些信息与解决此问题相关。)
I have a DLL written in C++ that needs to be used by an application in C#. It works great under Vista x86, but under x64 it fails to load. So I build an x64 version of the DLL and I detect whether the OS is x86 or x64 and use the appropriate interop call to the appropriate DLL. This works fine under Vista x86, but under Vista x64 I get a "side-by-side" error when it tries to load the DLL. Why exactly is it failing to load it, and what can be done to correct this? (Please let me know if you need more information, I'm not sure what information is relevant in trouble-shooting this issue.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
第一个想法:您能否尝试将项目的 C# 部分中的“平台目标”设置设置为“x86”,看看它是否能在 Vista 64 计算机上以 32 位兼容模式运行?
有关 SxS 错误的更多信息将会很有用 - 它可能与未安装的某些特定(32 位?)版本的运行时库有关?
One first idea: Could you try setting the "Platform Target" setting in the C# part of the project to "x86", to see if it will run in 32-bit compatibility mode on the Vista 64 machine?
More information about the SxS error would be useful - it might be related to some specific (32-bit?) versions of the runtime libraries that are not installed?
MadKeithV 的答案的一些进一步信息:
在 Windows x64 中,进程可以作为 32 位或 64 位进程启动。 64位进程只能加载64位dll,32位进程只能加载32位dll。
如果.Net应用程序的平台目标(例如在项目属性中指定)设置为“任何CPU”,则中间代码将根据目标平台编译为32位或64位代码,即在x64系统上64位代码将被生成。
因此代码无法再加载 32 位 dll。
如果您的代码加载非托管程序集,您应该始终显式指定目标平台。
some further information to the answer of MadKeithV:
In Windows x64 a process may be started as 32bit or 64bit process. A 64bit process can only load 64bit dlls and a 32bit process only 32bit dlls.
If your platform target (e.g. specified in the project properties) of your .Net application is set to "Any CPU", the intermediate code will be compiled to 32bit or 64bit code depending on the target platform, i.e. on a x64 system 64bit code will be generated.
Therefore the code can no longer load a 32bit dll.
If your code loads unmanaged assemblies you should always specify the target platform explicitly.
需要在客户端计算机上安装适用于 x64 的 VC90 的 redist。 就清单而言,我认为您可以更改它以删除processorArchitecture 标签。 要么这样,要么说“任何”。
The redist for VC90 for x64 will need to be installed on the client machine. As far as the manifest goes, I think you can alter it to remove the processorArchitecture tag. Either that or have it say "any".
如果其他方法都不起作用..您可以尝试进程监视器。
它会向您显示未找到哪个文件(依赖项)。这可能会引导您继续。
If nothing else works.. you can give Process Monitor a try.
It shows you which file (dependency) was not found.. this may give you a lead to proceed.
并排错误很可能是由您的 c++ dll 清单文件设置引起的,要么它们没有嵌入,要么您选择不嵌入清单并使用 32 位版本清单。
简单的解决方案是将您的 C# 应用程序标记为 x86 cup 并使用 32 位 dll 运行。
The side by side error is more then likely caused by you c++ dll manifest file settings either they are not getting embedded or you have chosen to not embed the manifest and is using the 32bit versions manifest.
The simple solution is to mark your c# application as for the x86 cup and run with the 32bit dll.