【问题标题】:Calling C++ function using DllImport使用 DllImport 调用 C++ 函数
【发布时间】:2011-11-01 00:21:37
【问题描述】:

这是基本的,如何从 C# DllImport 调用下面的函数 SubscribeNewsFeed?

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();
        }
    }

【问题讨论】:

  • 即使在 C++ 中,你也需要实例化一个 LogAppender 来调用它。

标签: c# .net c++ unmanaged dllimport


【解决方案1】:

PInvoke 不能用于以这种方式直接调用 C++ 函数。相反,您需要定义一个 extern "C" 函数,该函数调用 PInvoke 函数并将 PInvoke 调用到该函数中。此外,您不能 PInvoke 进入类实例方法。

C/C++ 代码

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

C#

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

【讨论】:

    【解决方案2】:

    P/Invoke 不能这样工作。它只能导入 C 函数。因此,托管 (C#) 和本机 (C++) 世界之间存在不同类型的互操作。通过 COM 进行互操作将是一种解决方案 - 提供另一个 C 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      相关资源
      最近更新 更多