将 Corflags:16 dll 加载到 x86 应用程序中会在 64 位系统上崩溃
我在我的项目中使用外部 dll。当我尝试在 64 位计算机上运行该应用程序时,它因 FileLoadException
崩溃。由于它在 32 位系统上运行良好,因此我怀疑该 dll 是 32 位的。但是,将项目的目标平台设置为 x68 并没有帮助。
我读了 c# 中的 64 位应用程序中的 32 位 dll 和 在 64 位应用程序中加载 32 位 DLL 库 和其他一些页面告诉我应该构建整个应用程序作为 32 位进程(这不会打扰我 - 它应该只能在 64 位 Windows 上执行),但如果不设置目标平台,我不知道如何在 64 位开发计算机上构建 32 位应用程序。代码
很简单
static void Main(string[] args)
{
var mf = new QuickFix43.MessageFactory();
Console.WriteLine("running");
Console.ReadKey();
}
,QuickFix 的东西来自 dll。
编辑: 我用 CorFlags 检查了 dll,发现
CLR Header: 2.5
PE : PE32
CorFlags : 16
这意味着该 dll 是一个混合模式程序集,只能在 i386 环境中加载( http://blogs.msdn.com/b/slessard/archive/2010/04/09/types-of -managed-code-assemblies.aspx )
是否可以在 64 位环境中加载它?
I am using an external dll in my project. When i try to run the application on a 64bit machine, it crashes with a FileLoadException
. Since it works fine on a 32bit system, i suspect the dll to be 32bit. However, setting the project's target platform to x68 doesn't help.
I read 32bit dll in 64bit application in c# and Load 32bit DLL library in 64bit application and some other pages that tell i should build the whole app as a 32bit process (which wouldn't bother me - it should just be executable on a 64bit windows), but i don't know how to build a 32bit app on a 64bit dev machine if not by setting the target platform...
The code is just
static void Main(string[] args)
{
var mf = new QuickFix43.MessageFactory();
Console.WriteLine("running");
Console.ReadKey();
}
and the QuickFix stuff is from the dll.
Edit:
I checked the dll with CorFlags and figured
CLR Header: 2.5
PE : PE32
CorFlags : 16
which means that the dll is a Mixed-mode assembly that can be loaded only in an i386 environment ( http://blogs.msdn.com/b/slessard/archive/2010/04/09/types-of-managed-code-assemblies.aspx )
Is is it possible to load this in an 64bit environment?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您还可以在 64 位环境上运行 32 位应用程序。但如果您想加载 32 位 DLL,则必须将应用程序构建为 32 位应用程序。您可以通过在“调试”和“发布”模式下将目标平台设置为 x86 来完成此操作。这应该可以解决你的问题。
You can also run 32bit applications on an 64bit environment. But if you want to load a 32bit DLL you must build your application as a 32bit one. You can do this by setting the target platform to x86 in the "Debug" and "Release" mode. This should solve your problem.
好的,这就是答案。问题实际上并不是我的项目无法加载本机dll。问题是我的项目调用了一个托管 dll,该 dll 调用了有问题的本机 dll。我的项目的目标平台设置为 x68,但托管 dll 被编译为“任何 cpu”。使用 x68 重新编译中间托管 dll 有效。
OK, so heres the answer. The problem was actually not that my project could not load the native dll. The problem was that my project calls a managed dll that calls the native dll in question. The target platform of my project was set to x68 but the managed dll was compiled as "any cpu". Recompiling the intermediate managed dll with x68 worked.