在64位环境中使用32位汇编

4

我正在尝试将DevIL.NET集成到3ds Max中,以便自动将我的图像转换为单一格式。为此,我创建了一个C#类库,接受一个字符串并返回新的文件路径。

public static class FileConverter
{
    public static string ConvertFile(string _sOriginal)
    {
        // Load the file, save the file, return the new filepath
    }
}

该项目参考了 DevIL.NET,它是一个32位的版本。我的应用程序是64位的版本,会出现 BadImageFormatException 错误,并提示“it”不是有效的 Win32应用程序。
我已经尝试通过在 .csproj 文件中添加以下一行代码,使我的应用程序变成32位版本:<PlatformTarget>x86</PlatformTarget>。这样,我的测试项目可以正常工作,但我的类库却不行,因为3ds Max是一个64位的应用程序。
如何解决这些32-64位问题,以便我的插件能够正常工作?给定的条件是3ds Max将是64位的,而DevIL.NET将是32位的。我似乎无法使用 VC++ Express 2008 从源代码构建64位版本的 DevIL.NET。
2个回答

5
您不能将一个“位数”不同的DLL加载到以另一个“位数”运行的进程中。解决问题的唯一方法是对齐平台或在其自己的进程中运行另一个“位数”DLL。

我曾经为一个接受插件的64位应用程序做过这个工作。我创建了一个64位的shim DLL,它进入应用程序并通过IPC与32位进程通信。由于第三方DLL也是32位的,所以需要这个32位进程。

这真是一件痛苦的事情,但不幸的是,在那个时候,其他供应商没有64位支持,这是必要的痛苦。

您可以使用.NET中的Process相关类来控制您的64位shim中的另一个32位进程 - 这实际上就是我最终采取的方法。


尝试在64位环境下构建DevIL.NET包装器是否是个好主意?被包装的DevIL.dll也可用于64位。因此,我认为这将使所有内容都与64位对齐,对吗? - Marnix
1
如果你能将这个其他的DLL转换成64位,那么你就可以用AnyCPU编译自己的代码,然后一切都应该正常工作。这将是最好的方法。 - Adam Houldsworth

0

在同一进程中不能混合32位代码和64位代码。您需要通过某种方式使用两个进程,或找到一种方法来使用全部32位或全部64位。

Visual Studio的Express版本不支持64位目标。如果您购买了标准版,则可以尝试以64位模式重新编译插件。但请注意,这可能并不简单,因为您可能需要修改代码,以防它包含有关位数的假设。

一个可能更容易的选项是使用32位版本的3ds。


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