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 ビット アプリケーションでは、これを 1 回行う必要がありました。アプリケーションに入り、IPC を介して 32 ビット プロセスと通信する 64 ビット shim DLL を作成しました。サードパーティの DLL も 32 ビットであるため、この 32 ビット プロセスが必要でした。

それは裏側の適切な痛みでしたが、残念ながら、他のベンダーが当時 64 ビットをサポートしていなかったため、必要な痛みでした。

.NETの関連するクラスを使用して、64 ビット シムからこの他の 32 ビット プロセスを制御できますProcess。これは、実際に私が行ったことです。

于 2011-07-19T08:28:20.870 に答える
0

同じプロセスで 32 ビット コードと 64 ビット コードを混在させることはできません。何らかの方法で 2 つのプロセスを使用するか、すべて 32 ビットまたはすべて 64 ビットを使用する方法を見つける必要があります。

Visual Studio の高速バージョンは、64 ビット ターゲットをサポートしていません。標準バージョンを購入すると、プラグインを 64 ビット モードで再コンパイルできる場合があります。ただし、ビット数に関する仮定が含まれている場合はコードを変更する必要があるため、それほど単純ではないことに注意してください。

おそらくより簡単なオプションは、3ds の 32 ビット バージョンを使用することです。

于 2011-07-19T08:28:04.480 に答える