将 Corflags:16 dll 加载到 x86 应用程序中会在 64 位系统上崩溃

发布于 2024-11-03 19:01:35 字数 1148 浏览 5 评论 0原文

我在我的项目中使用外部 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ぇ气 2024-11-10 19:01:35

您还可以在 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.

生生漫 2024-11-10 19:01:35

好的,这就是答案。问题实际上并不是我的项目无法加载本机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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文