我有一些 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/