3

我正在尝试将 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
    }
}

该项目引用的是 32 位版本的 DevIL.NET。我的应用程序是 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。

4

2 回答 2

4

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

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

这在背后是一种适当的痛苦,但不幸的是,由于其他供应商当时没有 64 位支持,因此这是一种必需的痛苦。

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

于 2011-07-19T08:28:20.870 回答
0

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

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

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

于 2011-07-19T08:28:04.480 回答