【发布时间】:2009-01-01 04:30:38
【问题描述】:
我正在尝试为程序创建一个插件。该程序通过加载您的插件 DLL 并在该 DLL 中执行特定命名的函数来工作。很标准的东西。但是,我想在 C# 中创建我的插件(而且我有点新手)。我的问题是,我可以从 C# 中导出常规的 C 类函数吗?或者我如何轻松地创建一个存根来做到这一点?
到目前为止,谷歌还没有提供帮助。
【问题讨论】:
我正在尝试为程序创建一个插件。该程序通过加载您的插件 DLL 并在该 DLL 中执行特定命名的函数来工作。很标准的东西。但是,我想在 C# 中创建我的插件(而且我有点新手)。我的问题是,我可以从 C# 中导出常规的 C 类函数吗?或者我如何轻松地创建一个存根来做到这一点?
到目前为止,谷歌还没有提供帮助。
【问题讨论】:
通过一系列相当复杂的步骤,我设法得到了我想要的东西:
在 C# 方面:
然后我创建了一个 MFC DLL,公开了我需要为插件接口导出的函数。然后在我的 C++ 代码中使用 #import 指令加载前面提到的 tlb 文件。这会生成一个存根,因此我可以轻松地通过 COM 从 C++ 调用我的 C# 代码。
结果似乎完美运行并且性能是瞬时的(这有点令人惊讶,我认为 CLR 加载开销会很明显)。
将 CLR 加载到这个特定的应用程序中并不是真正的问题,但我担心其他插件的版本控制问题。当我通过 COM 完成这一切时,这真的是一个问题吗?
【讨论】:
不,C# DLL 是托管的,这意味着您需要加载 CLR 才能让计算机理解它。您也许可以使用普通的 C++ 项目,将 C++/CLI 添加到其中(项目设置),使用 C# DLL,然后编写基本的 C 导出函数来环绕它。
这将是我要尝试的第一件事。
【讨论】:
您无法使用 C# 或任何 .Net 框架语言创建本机 DLL。但是,.Net 框架可以通过 P/Invoke 使用本机 DLL。
无论如何,用 C# 编写本机 DLL 是不切实际的。最好用 C 或 C++ 编写 DLL。
如果您要使用 .Net 框架语言(托管 C++、C#、.Net)制作最终程序,则可以使用 C# 制作 DLL,否则不要。
【讨论】:
给操作:
我为使用旧 COM 互操作程序集的包进行自定义插件开发。我们想使用 c#,但由于它严重依赖后期绑定,所以我们不得不使用 vb.net,并将接口类构建为 COM 互操作类。一旦你克服了这个障碍,你通常就很成功了。 “接口”库之外的所有支持库都是在 C# 中完成的,因此当基础应用程序的新版本即将推出时,工作量就会减少。
很想听听您编写插件的目的是什么,所以如果有任何我们可以帮助您的提示和/或技巧,我们可以在您继续前进时这样做。
【讨论】:
如果您使用 Visual C++,您可以创建一个本机 dll,该 dll 包含用 .NET dll 编写的功能。如果您完全了解 C++(或者如果您是一个快速学习者),那么编写一个调用您在 C# 程序集中实现的函数的 C++ shim dll 将相当简单。
但是,你不能只使用 C#。
【讨论】:
您可以在 C++/CLI 中编写程序集/dll,将函数公开为标准 DLL 导出。然后,您可以根据需要将它们用作 C# 程序集中的方法的代理。
但是,这并不意味着这是一个好主意。强制 CLR 加载到进程中是一个非常激烈的步骤,插件作者不应强制其主机。
例如,Microsoft 强烈建议 shell 扩展作者(即 Windows 资源管理器的插件代码)不要在 .NET 中(通过 COM)编写这些插件,因为它们不会'不希望将 CLR 加载到如此关键的应用程序中。
应用程序有可能(尽管不太可能)需要加载 CLR 本身和某个时间点,如果插件已经加载了给定版本,那么这可能会产生版本控制问题。此外,CLR 不能从进程中卸载,而宿主应用程序可能希望能够卸载插件。
【讨论】: