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

标签 c# visual-c++ c++-cli

我有一些 C++ 代码:

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

  double __declspec(dllexport) compute(IProgressCB *progressCB, ...);
}

我从中创建了“compute.dll”,并在 Visual Studio 2008 中启用了“公共(public)语言运行时支持 (/clr)”。

我想从 C# 调用此代码。

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

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

然而,VS 的自动完成功能找到了“Compute”命名空间,但没有找到其中的任何类或函数!? 当我尝试编译时;它提示 IProgressCB 没有公开。 如果我在 IProgressCB 声明之前写 public,它会提示无法从密封类型“Compute.IProgressCB”派生。

我在这里做错了什么? 我想采用现有的 C++ 代码,不对其进行任何修改,而是使用/clrc 对其进行编译,然后从 C# 中使用它。这不可能吗?

最佳答案

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

关于c# - 使用/clr 编译现有的 C++ 代码,然后从 C# 调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6467736/

相关文章:

c# - 为什么要处理一个肯定会很快被处理掉的对象呢?

c++ - 有一个dll项目,我可以强制将它链接到一个静态库吗?

c++ - XCode 不会从文件中获取输入

c++ - CLR中 native 堆的内存管理

c++ - 错误 : no instance of overloaded function

c++ - 访问非托管代码中函数的指针

c# - rdr 是一个 'variable' 但像 'method' 一样使用

c# - 全局命名空间 C# 中的命名空间

c# - 颜色 TextBlock 取决于枚举值

C++/Windows : HeapAlloc() for contention-free per-thread heaps