如何创建中间库?

Posted

技术标签:

【中文标题】如何创建中间库?【英文标题】:How to create an in-between library? 【发布时间】:2010-11-30 20:21:41 【问题描述】:

我正在寻找一些有关如何使用 C++ 和 C# 库实现某些功能的信息。 我想知道的是如何解决以下问题:

C# 应用程序:-有一个窗口 C++ 库:-有一个名为 create_button(x,y) 的函数,当 调用,它将在上创建一个按钮 c# 应用程序的窗口。 (如果 C# 应用程序未运行, 什么都不会发生) C++ 应用程序:-动态链接到 C++ 库并调用 create_button() 功能。

我将如何解决这个问题,我很高兴听到你的一些想法。 平台是窗户。我的问题是,如何让 C++ 库与 c# 应用程序通信以创建新按钮?它是否已链接,套接字,...我特别想到 Linux 中的 GTK+,您链接到 gtk+ 库,但是该库如何与 GNOME 交互以创建新窗口等,诸如此类。我对编写 dll 并将它们链接到 c# 应用程序不感兴趣,我有兴趣创建一个中间库。

【问题讨论】:

那么您的 c# 窗体作为不同的进程运行? C# 应用程序是否知道这将发生,您是否可以在其中放置代码以提供帮助,或者您打算对任意 c# 应用程序执行此操作? @max:确实c#应用程序是我自己维护的应用程序。 @Len:是的,因为我将创建 c# 应用程序 【参考方案1】:

我想不出任何理智的方式来做你想做的事。我认为您应该做的是创建函数以在 C# 应用程序中进行绘图,然后公开一些消息接口,例如套接字,该接口允许外部应用程序发送消息,命令 C# 应用程序执行您告诉它的操作。当 C# 应用程序接收到消息类型为 DRAW_BUTTON 的消息时,它会使用它接收到的消息中指定的任何参数绘制按钮。

【讨论】:

嗨 frankc,我确实在考虑做这样的事情。你建议我在 windows 中使用消息系统?【参考方案2】:

您将在这里遇到问题,因为 C# 是托管的,而 C++ 是本机的。据我所知,在 CLI 中从托管调用本机代码的唯一方法是使用 P/Invoke 层,在这种情况下,您需要导入 DLL、编写原型等。

此外,我相信 P/Invoke 调用是针对 C 函数,而不是 C++,尽管您可以通过添加一个 C 库来调用,然后调用您的 C++ 库来解决这个问题。

【讨论】:

确实,我会通过公开一个 C 库来做到这一点,没有问题。但这不是我的问题所在,我想为我的 c++ 应用程序创建一个库,它实际上将与我的单实例 c# 应用程序进行通信。现在正如下面 frankc 所建议的那样,我认为我应该为此使用 Windows 消息。 P/Invoke 不是唯一可用的互操作。有 IJW(C++/CLI 互操作),看看 ***.com/questions/2211867/… 。至于进程间通信,可以使用命名管道、套接字、COM 或共享内存。【参考方案3】:

如果您可以在 C# 中创建一个小而合适的 HWND(不知道小部件),您可以使用它并使用 C# 的窗口作为父窗口来创建一个 c++ 窗口。

几年前,我们正是为 java/c++ 进程对这样做的。但是,Java 应用可以通过 RPC 将 HWND 值报告给 c++ 应用,因此设置起来并不难。

【讨论】:

【参考方案4】:

假设您控制 C# 应用程序的代码,并且您控制 C++ 应用程序的代码,并且大概是“中间库”。我发现自己在问“你为什么要这样做?”

如果您希望 C++ 应用程序能够在 C# 应用程序上添加给定按钮,并且按下该按钮能够与 C++ 应用程序通信,那么我个人会使用标准 IPC并且在 C++ 应用程序和 C# 应用程序之间有一个通信通道,只需让 C++ 应用程序通过 IPC 请求 C# 应用程序显示按钮,然后让 C# 应用程序发送任何详细信息(很可能是按下按钮的事实) 通过相同的 IPC 通道发送到 C++ 应用程序。

如果这条路线行不通,那么我认为您需要澄清您目前正在尝试解决的问题“解决方案”会被误导。

【讨论】:

嗨 Len,我的目标如下:我想为程序员提供一个使用特殊接口的库,并且不想在我的应用程序中暴露 ipc(不是出于安全原因,或任何其他的,但为程序员提供一个透明层)。在阅读了很多很好的反应之后,我认为我的方法是:创建一个公开一些函数的 C 库,该库本身将对 c# 应用程序进行 IPC。您对使用 IPC 方法有什么建议吗?我在考虑 MemoryMapped Files 或 Sockets。谢谢你的回答! 这一切之前都已经完成了......为什么不简单地通过 C# 应用程序中的 COM 公开您需要的功能呢?

以上是关于如何创建中间库?的主要内容,如果未能解决你的问题,请参考以下文章

Go语言经典库使用分析| Negroni 中间件

用git创建一个中间分支

spring jdbcTemplate实现中间库方式同步数据

Java keyTool - 将主要/次要中间证书附加到密钥库[关闭]

好的轮子中是如何调用中间件的?

如何根据请求创建 OWIN 中间件