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

时间:2011-07-19 08:26:09

标签: .net 32bit-64bit 3dsmax devil

我正在尝试将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。说“它”不是有效的Win32应用程序。

我已经尝试通过在.csproj文件中添加额外的行来使我的应用程序成为32位:<PlatformTarget>x86</PlatformTarget>。通过这种方式,我的测试项目可以正常工作,但我的类库却没有,因为3ds Max是一个64位应用程序。

如何将这些32-64问题排除在外,以便我的插件能够正常工作?鉴于3ds Max将是64位而DevIL.NET将是32位。我似乎无法在VC ++ Express 2008中从源代码自己构建64位DevIL.NET。

2 个答案:

答案 0 :(得分:4)

您无法将一个“位数”的DLL加载到另一个“位数”运行的进程中。解决问题所能做的就是调整平台或在其自己的进程中运行其他“位”DLL。

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

在背后是一个适当的痛苦,但不幸的是,由于当时其他供应商没有64位支持,所以需要付出痛苦。

您可以使用.NET中的Process相关类从64位填充程序控制这个其他32位进程 - 这实际上就是我最终要做的。

答案 1 :(得分:0)

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

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

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