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