2011-02-03 109 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) 
      ); 

當我調用它的方法,我得到錯誤信息:

無法找到切入點命名爲Run in dll

+0

什麼樣的dll?用C寫的? – 2011-02-03 10:41:36

+0

我猜這不是一個COM DLL。你確定DLL中的Run函數被導出嗎? – 2011-02-03 10:43:50

回答

2

「運行」看起來是一種非靜態的類方法。儘管可以從C#中調用這些方法,但這不是主要的用例。這將是比較容易的方式,從.NET使用它,如果你通過COM揭露它,或者,至少作爲一個普通的C接口:

 

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

我不知道這會幫助,如果該函數是一個類的成員,而是要找到名字的切入點,沒有順序,你需要在你的DLL .def文件..

LIBRARY mylib 
    Run @1