使用/ clr编译现有的C++代码,然后从C#调用它

And*_*ndy 7 c# c++-cli visual-c++

我有一些C++代码:

namespace Compute {
  class __declspec(dllexport) IProgressCB {
  public:
    virtual void progress(int percentCompleted) = 0;
  };

  double __declspec(dllexport) compute(IProgressCB *progressCB, ...);
}
Run Code Online (Sandbox Code Playgroud)

从中创建了"compute.dll",在Visual Studio 2008中打开了"公共语言运行时支持(/ clr)".

我想从C#调用此代码.

接下来,我创建一个C#控制台应用程序并添加compute.dll作为参考.然后我尝试子类化/实现IProgressCB:

public class Progress : Compute.IProgressCB
{
    public void progress(int percentCompleted)
    {
        Console.WriteLine(percentCompleted + "% completed.");
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,VS的自动完成找到了"Compute"命名空间,但没有查找其中的任何类或函数!?当我尝试编译; 它抱怨IProgressCB不公开.如果我在IProgressCB声明之前公开,它会抱怨无法从密封类型"Compute.IProgressCB"派生出来.

我在这做错了什么?我想采用现有的C++代码,不做任何修改,但用/ clrc编译它然后从C#中使用它.这不可能吗?

Log*_*ldo 3

“不做任何修改”是可能的,但您需要一个中间 C++/CLI 层来包装现有代码。C# 和其他 CLR 语言只能“查看”托管类型,即引用类、值类等。仅通过将 /clr 应用于现有代码库,您将无法避免编写额外的 C++ 代码。

  • @Andreas:C++/CLI 提供了一种使用 .NET 中现有代码的方法。您必须编写新的 C++/CLI 代码,但该代码可以理解并且仅适用于 .NET 和本机世界,因此您不需要重写现有行为,您可以委托给现有代码。 (2认同)