2011-02-03 19 views
0

DLLImportを使用してインポートするC++アセンブリがあります。DLLImportでのC#エラーの発見方法

私はそのメソッドを呼び出ししようとしています:

namespace Testing 
{ 
class Test{ 
int Run(char* filePath, bool bEntry, double duration){//code} 
}; 
} 

[DllImport(dllName, CharSet = CharSet.Auto)] 
     public static extern int Run(string filePath, bool bEntry, double duration) 
      ); 

ことで、私はそのメソッドを呼び出すと、私はエラーメッセージが表示されます:

エントリポイントを見つけることができません。 dllで実行と呼ばれる

+0

どのような種類のDLLですか? Cで書かれていますか? –

+0

これはCOM DLLではないと私は推測しています。 DLLの 'Run'関数がエクスポートされていますか? –

答えて

2

"実行"は、非静的なクラスメソッドのように見えます。 C#からこのようなメソッドを呼び出すことは可能ですが、これは主なユースケースではありません。あなたはCOM経由、またはAT-少なくともプレーンなCインタフェースとして公開している場合には、.NETからそれを消費する方法容易になるだろう:

 

extern "C" __declspec(dllexport) void* Testing_Test_Create(); 
extern "C" __declspec(dllexport) void Testing_Test_Destroy(void* self); 
extern "C" __declspec(dllexport) int Testing_Test_Run(void* self, char* filePath, bool bEntry, double duration); 
 

そしてここでは、C#からC++クラスのメソッドを呼び出す方法のサンプルです:

 

// Test.cpp in NativeLib.dll 
namespace Testing 
{ 
    class __declspec(dllexport) Test 
    { 
    public: 
     explicit Test(int data) 
      : data(data) 
     { 
     } 

     int Run(char const * path) 
     { 
      return this->data + strlen(path); 
     } 

    private: 
     int data; 
    }; 
} 
 
 

// Program.cs in CSharpClient.exe 
class Program 
    { 
     [DllImport(
      "NativeLib.dll", 
      EntryPoint = "[email protected]@@[email protected]@Z", 
      CallingConvention = CallingConvention.ThisCall, 
      CharSet = CharSet.Ansi)] 
     public static extern void TestingTestCtor(IntPtr self, int data); 

     [DllImport(
      "NativeLib.dll", 
      EntryPoint = "[email protected]@[email protected]@[email protected]", 
      CallingConvention = CallingConvention.ThisCall, 
      CharSet = CharSet.Ansi)] 
     public static extern int TestingTestRun(IntPtr self, string path); 

     static void Main(string[] args) 
     { 
      var test = Marshal.AllocCoTaskMem(4); 
      TestingTestCtor(test, 10); 

      var result = TestingTestRun(test, "path"); 

      Console.WriteLine(result); 

      Marshal.FreeCoTaskMem(test); 
     } 
    } 
 

エントリポイント名は、お使いのビルド構成/コンパイラごとに異なることが、ので、それらを得るために、ユーティリティDUMPBIN使用する場合があります。繰り返しますが、これは概念の証明にすぎず、実際のコードではCOMを使用する方が良いでしょう。

+0

ヘッダーファイルにextern "C" __declspec(dllexport)を追加しましたが、コンパイル時にエラーメッセージが表示されます:コマンドラインエラーD8016: '/ GL'と '/ ZI'コマンドラインオプションは互換性がありませんcl – InfoLearner

+0

プロジェクトのプロパティの「全体最適化」を「いいえ」に設定した後、エラーメッセージが表示されます: 'extern'ストレージクラス指定子はメンバーに違法です – InfoLearner

+0

私はまだ 'C#からそのようなメソッドを呼び出すことは可能ですCOM、プレーンCまたは静的C++関数 – leppie

0

私は、これは、序数ではない、あなたはあなたのDLL内の.defファイルが必要になります関数は、クラスのメンバーである場合に役立ちますが、名前のエントリポイントを見つけることはよく分からない...

LIBRARY mylib 
    Run @1 
関連する問題