【问题标题】:Use a 32-bit assembly in 64-bit environment在 64 位环境中使用 32 位程序集
【发布时间】:2011-10-08 07:50:56
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 尝试在 64 位环境中自己构建 DevIL.NET 包装器是否是个好主意?包装的 DevIL.dll 也可用于 64 位。所以我认为这会以 64 位对齐所有内容,对吧?
    • 如果您可以让这个其他 DLL 成为 64 位,那么您可以在 AnyCPU 中编译您自己的代码,然后它应该可以工作。那将是最好的方法。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 2014-04-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多