我可以导出 C++与 C# dll 的 C 风格方法的接口

发布于 2024-11-16 16:17:31 字数 276 浏览 1 评论 0原文

我试图避免 COM。我正在 C++ exe 上设计混合 C# 和 C++ 控件。

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

因此,如果可以将整个 C# 接口导出到 C++ exe,那就容易多了。

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

I'm trying to avoid COM. I'm designing a mixture C# and C++ controls on a C++ exe.

One method I came up with is PInvoking my C++ exe from C#, and sending windows messages to the C# windows. However the amount of methods I call on the controls base class is too long to justify windows messages.

So, if it's possible to export a whole C# interface to a C++ exe, that would be way easier.

I want to avoid COM because I may have to support windows 2000, and doing COM without relying on the manifest would be a deployment hassle on a software package that currently doesn't set much in the registry.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

失退 2024-11-23 16:17:31

您可以为每个 C++ 控件以及 C# 的 PInvoke 编写一个 C 包装器。

例如,这个 C++ 类:

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

以及 c++ exe 中的 extern "C" 块:

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

You could write a C wrapper for each of your C++ controls, and PInvoke from C#.

For example this C++ class:

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

and in a extern "C" block in your c++ exe:

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

and in 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);
}
顾冷 2024-11-23 16:17:31

我使用 C++/CLI 和 VS 2010 来执行此操作。您可以公开一个可以按通常方式使用的 DLL C 接口,实现只是将该接口中的数据编组到您的 C# 程序集。

我认为相关问题 调用 C#来自 C++、反向 P/Invoke、混合模式 DLL 和 C++/CLI

I use C++/CLI with VS 2010 to do this. You can expose a DLL C interface that can be consumed in the usual way, the implementation would just marshal data from that interface to your C# assembly.

Related question I think Calling C# from C++, Reverse P/Invoke, Mixed Mode DLLs and C++/CLI

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文