2011-10-31 99 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接口。