2011-10-31 88 views
1

這是一個基本的,我如何從C#DllImport中調用以下函數SubscribeNewsFeed?使用DllImport調用C++函數

class LogAppender : public L_Append 
{ 
public: 
    LogAppender() 
     : outfile("TestLog.txt", std::ios::trunc | std::ios::out) 
     , feedSubscribed(false) 
    { 
     outfile.setf(0, std::ios::floatfield); 
     outfile.precision(4); 
    } 



    void SubscribeNewsFeed() 
    { 
     someOtherCalls(); 
    } 

}; 

我無法弄清楚如何在我的C#程序中使用的DllImport時,這裏包含類名稱:

class Program 
    { 

     [DllImport("LogAppender.dll")] 
     public static extern void SubscribeNewsFeed(); 

     static void Main(string[] args) 
     { 
      SubscribeNewsFeed(); 
     } 
    } 
+0

即使在C++中,你也需要實例化一個LogAppender來調用它。 – Rup

回答

3

的PInvoke不能用來直接調用成C在此++函數辦法。相反,您需要定義一個調用PInvoke函數和PInvoke函數的extern "C"函數。另外,您不能將PInvoke轉換爲類實例方法。

C/C++代碼

extern "C" void SubscribeNewsFeedHelper() { 
    LogAppender appender; 
    appender.SubscribeNewsFeed(); 
} 

C#

[DllImport("LogAppender.dll")] 
public static extern void SubscribeNewsFeedHelper(); 
1

的P/Invoke不工作的方式。它只能導入C函數。因此,託管(C#)和原生(C++)世界之間存在不同類型的互操作。通過COM進行互操作將是一個解決方案 - 提供另一個C接口。