在64位环境中使用32位程序集



我正在尝试整合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位的。我似乎造不出魔鬼。

您不能将一个"位"的DLL加载到作为另一个"位"运行的进程中。要解决这个问题,你所能做的就是对齐平台或在它自己的进程中运行另一个"bitness"DLL。

对于一个接受插件的64位应用程序,我必须这样做一次。我创建了一个64位shim DLL,它进入应用程序并通过IPC与32位进程通信。由于第三方DLL也是32位的,因此需要此32位进程。

这是一个适当的痛苦,但不幸的是,这是一个必要的痛苦,因为其他供应商当时没有64位支持。

您可以使用。net中的Process相关类从64位shim控制其他32位进程-这实际上是我最终做的。

不能在同一进程中混合使用32位代码和64位代码。您将需要以一种方式或另一种方式使用两个进程,或者找到一种方法来使用所有32位或所有64位。

Visual Studio的快速版本不支持64位目标。如果您购买了标准版本,那么您可以在64位模式下重新编译插件。但是请注意,它可能没有那么简单,因为您可能需要修改代码,以防它包含有关位的假设。

一个可能更简单的选择是使用32位版本的3ds。

最新更新