c# - 我可以将带有 C 风格方法的 C++ 接口(interface)导出到 C# dll 吗

标签 c# c++ com interface pinvoke

我正在努力避免使用 COM。我正在 C++ exe 上设计混合 C# 和 C++ 控件。

我想到的一种方法是从 C# 调用我的 C++ exe,然后将 Windows 消息发送到 C# 窗口。但是,我在控件基类上调用的方法数量太长,无法证明 Windows 消息的合理性。

因此,如果可以将整个 C# 接口(interface)导出到 C++ exe,那会容易得多。

我想避免使用 COM,因为我可能必须支持 Windows 2000,并且在不依赖 list 的情况下使用 COM 会给目前在注册表中设置不多的软件包部署带来麻烦。

最佳答案

您可以为每个 C++ 控件编写一个 C 包装器,并从 C# 编写 PInvoke。

例如这个 C++ 类:

class Example
{
  public:
  int MyMethod(int param);
}

并在您的 C++ exe 中的外部“C” block 中:

void * CreateExample() { return new Example(); }
int Example_MyMethod(void * handle, int param) { reinterpret_cast<Example*>(handle)->MyMethod(param)); }

在 C# 中:

public class Example
{
 private IntPtr handle;

 public Example()
 {
   handle = _CreateExample();
 }

 public int MyMethod(int param)
 {
    return _MyMethod(param);
 }

 [DllImport("yourdll.exe")]
 private static extern IntPtr _CreateExample();

 [DllImport("yourdll.exe")]
 private static extern int _MyMethod(IntPtr handle, int param);
}

关于c# - 我可以将带有 C 风格方法的 C++ 接口(interface)导出到 C# dll 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460054/

相关文章:

windows - 从 32 位 wix 脚本注册 64 位 com 组件

c# - 使用 LINQ 和带有输出参数的存储过程丢失小数精度和小数位数

c# - ZeroMQ CLRZMQ - 轮询套接字

c++ - Vb.net 和 C++ 的 MATH 函数中任何已知的歧义

c++ - 为什么我的 VS2010 native C++ 应用程序不会突然启动,并给出并排错误?

windows - 为什么 Windows Search 会在我的 IFilter 中查询一堆奇怪的界面?

c# - 从 C# 调用 AirBnb api 时出现 403

C# 在不知道对象类型的情况下获取对象的名称

c++ - 将变量插入 SQLite 查询

c++ - AfxGetInstanceHandle() 触发断言失败