32位dll导入64位.Net应用程序

时间:2010-06-14 11:55:26

标签: c# .net delphi 32bit-64bit

我遇到了问题,我从昨天开始尝试解决它,但没有运气。 我有32位delphi dll,我想在.NET Win应用程序中导入。此应用程序必须基于任何CPU模式构建。当然,BadImageFormatException即将到来,这意味着在x64应用程序中无法加载x86 dll .. 我用Google搜索并找到解决方案,它说我必须做包装,但对我来说并不清楚。任何人都可以告诉如何解决这个问题,是否有任何可能的方法我可以在程序建立任何CPU或x64模式(可能是另一种解决方案)中导入32位Delphi dll。

5 个答案:

答案 0 :(得分:14)

您需要做的是在32位进程中编写一个承载32位DLL文件的包装器应用程序。

然后,您的64位应用程序必须通过网络方式与此32位进程通信,或通过COM对象或类似方式使DLL函数可用。

无法在64位进程内运行32位DLL,无论你怎么努力,所以你需要在32位进程中运行它。

如果不能选择仅为32位编译应用程序,则别无选择,只能创建主机应用程序。

答案 1 :(得分:5)

一般的想法可能是使用托管的32位包装器dll包装您的(非托管)32位DLL并使其可见COM。这允许通过其COM接口调用包装DLL。

您可以使用COM代理来使您的COM DLL显示为进程外COM服务器。 请查看此SO问题,以获取有关此主题的更多信息:Access x86 COM from x64 .NET

答案 2 :(得分:2)

据我所知,您无法使用64位应用程序中的32位DLL。也就是说,您可以仅为X86编译应用程序。

您找到的解决方案可能是关于如何在“任何CPU”编译的项目中使用32位和64位版本的DLL,具体取决于应用程序是以32位还是64位运行环境。

为此,您可以在C#中编写两个包装DLL,一个用于64位,一个用于32位,并根据您是在64位还是32位OS上运行使用相应的包装器。

但是,当你拥有的是32位DLL时,这不起作用。 64位应用程序不能使用32位DLL,而32位应用程序也不能使用64位DLL。

因此,您需要编译32位应用程序,或者必须创建DLL的64位版本。

答案 3 :(得分:1)

一个解决方案虽然有点混乱,但可能是编写一个单独的32位应用程序,您可以从64位应用程序(例如控制台应用程序)进行通信,您可以向/从中发送命令。

不漂亮,但如果你只需要偶尔打电话就可以。

答案 4 :(得分:1)

只需将.Net应用程序编译为Platform x86即可。它将在x64机器上运行,它将使用您的32位DLL。不要在包装纸上浪费时间。