我可以在.NET中创建常规的Windows DLL(用于插件)吗?

我正在尝试为程序创建一个插件。 该程序通过加载您的插件DLL并在该DLL中执行特定命名的函数来工作。 很标准的东西。 但是,我想用C#创建我的插件(我有点新手)。 我的问题是,我可以从C#导出常规C类函数吗? 或者我如何轻松创建存根来做到这一点?

到目前为止谷歌一直没有帮助。

我设法通过一系列相当复杂的步骤得到了我想要的东西:

在C#方面:

  1. 我创建了一个带接口的C#类
  2. 使COM可见,
  3. 使用强名称密钥文件签署程序集
  4. 使用gacutil将程序集添加到GAC
  5. 使用REGASM工具注册它并生成一个tlb类型的库文件。

然后我创建了一个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使用Native DLL。

无论如何,在C#中编写本机DLL是不实际的。 你最好用C或C ++编写DLL。

如果您要使用.Net框架语言(Managed C ++,C#,。Net)制作最终程序,那么您可以在C#中创建DLL,否则不能。

对于op:

我为使用旧COM互操作程序集的程序包执行自定义外接程序开发。 我们想使用c#,但由于它在很大程度上依赖于后期绑定,我们必须结束使用vb.net,并将接口类构建为COM-interop类。 一旦你克服了这个障碍,你通常都是金色的。 “接口”库之外的所有支持库都是在C#中完成的,因此在新版本的基础应用程序首映时很快就可以完成。

很想听听你是什么编程加载项,所以如果有任何我们可以帮助你的提示和/或技巧,我们可以在你前进的过程中这样做。

如果使用Visual C ++,则可以创建包含.NET dll编写的function的本机dll。 如果你完全了解C ++(或者你是一个快速学习者),编写一个C ++ shim dll来调用你在C#程序集中实现的函数是相当简单的。

但是,你不能只使用C#。

您可以在C ++ / CLI中编写一个程序集/ dll,它将函数公开为标准DLL导出。 然后,如果需要,您可以将它们用作C#程序集中方法的代理。

但是,这并不意味着这是一个好主意。 强制CLR加载到进程是一个非常激烈的步骤,插件作者不应该强制它的主机。

例如,Microsoft强烈建议shell扩展作者(即Windows资源管理器的插件代码)不要在.NET中编写这些插件(通过COM),因为他们不希望将CLR加载到这样的关键应用程序中。

可能(尽管不太可能)应用程序将要加载CLR本身和某些点,如果插件已经加载了给定版本,那么这可能会产生版本问题。 此外,无法从进程卸载CLR,而主机应用程序可能希望能够卸载插件。