2011-06-16 12 views
2

2つのプロジェクト(C#とManaged C++)があります。 C#プロジェクトはManagedCPPプロジェクトのメソッドを呼び出す必要があります。 c#プロジェクトのリファレンスセクションで、管理されたcpp dllが追加されます。C#からC++/CLIコードを呼び出す

ライン1、2及び3は、コメント解除され、4行目にコメントされている場合は、さらに次のような問題が生じる:

未処理の例外:System.BadImageFormatException

次のようにコードベースです。

C# class:

using System.Runtime.InteropServices; 
using ManagedCPP; 

namespace CSharp 
{ 
class Program 
{ 
    //[DllImport("ManagedCPP")]     // Line 1 
    //public static extern void Convert();  // Line 2 

    static void Main(string[] args) 
    { 
     new Program().CreateObject(); 
    } 

    private void CreateObject() 
    { 
     //Convert();        // Line 3 
     ManagedCPPEntryClass c = new ManagedCPPEntryClass(); // Line 4 

     Console.ReadKey(); 
    } 
} 
} 

C++/CLI class(.h):

namespace ManagedCPP 
{ 
public ref class ManagedCPPEntryClass 
{ 
    public: 
     void Convert(); 
}; 
} 

C++/CLI class(.cpp):

#include "ManagedCPP.h" 
using namespace ManagedCPP; 

void ManagedCPPEntryClass::Convert() 
{ 
} 
+0

ここでは 'BadImageFormatException'のドキュメントを参照してください:http://msdn.microsoft.com/en-us/library/system.badimageformatexception.aspx –

+0

C#プロジェクトのプラットフォームターゲットを任意のCPUからx86に変更しました。今。しかし、何が問題だった。 C++/cliは、C++/cliプロジェクトのターゲットプラットフォームを設定するオプションがないので、x86にのみコンパイルします。 – Azodious

+0

C/CLIプロジェクトから出力アセンブリへの.net参照を追加し、P/Invokeをそのままにしておくのはなぜですか?あなたはマーシャリングなどを制御しているようには見えません。 –

答えて

4

ネイティブコード(C++)が、C#アプリケーションの.NET実行形式(32ビットまたは64ビット)と同じ形式(32ビットまたは64ビット)でコンパイルされていることを確認してください。これはあなたの問題の原因かもしれません。

デフォルトでは、.NetはOSと同じ形式で自身を実行します。 Visual Studioでコンパイルオプションを設定することで、選択した形式で強制的に実行できます。

+0

C#プロジェクトのプラットフォームターゲットを 'Any CPU'から' x86'に変更しました。しかし、何が問題だった。私はC++/cliプロジェクトのターゲットプラットフォームを設定するオプションがないので、C++/cliは 'x86'だけコンパイルします。 – Azodious

+0

可能です。ここで説明します。 http://stackoverflow.com/questions/2159494/c-cli-c-badimageformat-exception-when-loading-form – Azodious

1

私は、トピックに関する専門家ではないんだけど、CLIを直接としてC#で使用することができますが、あなたは、非CLIのアセンブリにアクセスするためにDLLIMPORTを使用する必要がありますそれがネイティブアセンブリの場合(共通インタフェースを使用する利点)

1

コメント行はアンママージAPIをアンマネージDll IPF_ManagedCPPから変換するために使用されます。実際には、IPF_ManagedCPPはDllで管理され、Convertは管理クラスのメソッドです。もちろん、これは動作しません。

C++/CLIクラスライブラリは、他のクラスライブラリとまったく同じようにクライアント.NETコードで使用する必要があります。 Unmanaged Dllは.NETプロジェクトでPInvokeを使用する方法とC++/CLIラッパーを使用する方法の2つの方法で使用できます。 IPF_ManagedCPPライブラリのPInvokeは必要ありません。

関連する問題