2010-12-02 12 views
4

私は、ネイティブC++ライブラリをラップする、混合モードのC++/CLIアセンブリを作成しました。それは正常にコンパイルされます。私はそのアセンブリを使用するC++/CLIアプリケーションを書くことができるので、動作することは分かっています。C#から混在モードのC++/CLIアセンブリを呼び出すにはどうすればよいですか?

私は同じC++/CLIアセンブリを使用するC#アプリケーションを作成しました。これもうまくコンパイルされます。しかし、私がそれを実行しようとすると、私は "BadImageFormatException"を取得し、以下に詳細な例外メッセージが表示されます。

私のアセンブリは混在モードであり、したがって「安全でない」ため、この例外が発生していると思います。しかし、私が読んだことから、安全でないアセンブリさえ、私がやっているローカルのハードドライブから実行すると信頼されるはずです。

ここで何が起こっているのか理解できる人はいますか?私がしようとしていることは可能なのでしょうか?

詳細な例外メッセージ:

 
System.BadImageFormatException was unhandled 
    Message="Could not load file or assembly 'asillyclass, Version=1.0.3988.20325, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format." 
    Source="ConsoleApplication1" 
    FileName="asillyclass, Version=1.0.3988.20325, Culture=neutral, PublicKeyToken=null" 
    FusionLog="=== Pre-bind state information === 
: User = SIG\\user 
: DisplayName = asillyclass, Version=1.0.3988.20325, Culture=neutral, PublicKeyToken=null\n (Fully-specified) 
: Appbase = file:///C:/projects/API/TestApp-C#/ConsoleApplication1/bin/Debug/ 
: Initial PrivatePath = NULL 
assembly : ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. 
=== 
: This bind starts in default load context. 
: Using application configuration file: C:\\projects\\API\\TestApp-C#\\ConsoleApplication1\\bin\\Debug\\ConsoleApplication1.vshost.exe.config 
: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config. 
: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
: Attempting download of new URL file:///C:/projects/API/TestApp-C#/ConsoleApplication1/bin/Debug/asillyclass.DLL. 
: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated. 
" 
    StackTrace: 
     at ConsoleApplication1.Program.Main(String[] args) 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

答えて

9

最も可能性の高い原因は、あなたが64ビットOSを実行している、と32ビット/ 64ビットの不一致があることである(例えば、DLLは32ビットであり、アプリは64ビット/ AnyCPUです)。

修正するには、アプリのプロパティに移動し、AnyCPUではなくx86を選択します。

+1

ほとんどすべてのC++/CLIプログラマが少なくとも1回は実行されるので、Microsoftはこのエラーメッセージを修正する必要があります。 "現在のプロセスは' x86_64'ですが、ライブラリは 'x86(32ビット)'環境にしか読み込めません。 (WinCE用のDLLを読み込もうとすると 'Itanium'、' ARM'または 'MIPS') –

+1

これは幾つか緩和されました。 Googleの検索結果はかなり早い段階にあります。 AnyCPUの代わりに、VS2010のデフォルトはx86になります。つまり、Connectの問題を開くと、私はそれをupvoteします。 :) –

+0

ありがとう!それは、私が実際にやったことは、x64をターゲットにするためにDLLを再コンパイルすることでした。何らかの理由でアプリケーションのプロパティで "Platform Target"設定が見つかりませんか? Visual C#のExpress Editionでこの設定が公開されていない可能性がありますか、それとも不足していますか? –

関連する問題