c# - 如何从 C# 将 EXE 注册/取消注册为 COM 对象?

标签 c# .net com regasm

EDIT 5/11/2013:这个问题最初询问如何使用 .NET 中的代码以编程方式注册 COM 对象,而无需使用 REGASM。 Yahia 的回答涵盖了如何以编程方式注册 DLL 和 EXE。

原始问题:目前,在设置默认版本(使用重新吸气并添加注册表项)。我们不再希望使用批处理脚本,因为我们遇到了一个问题,如果脚本失败,程序将不知道失败。有几种方法可以解决这个问题,但我不喜欢在不必要的情况下从代码调用批处理脚本的想法,所以我想切换到使用托管代码向 COM 注册我们的软件。

假设有可能,您如何从 C# 注册/取消注册 COM 对象?谷歌搜索只能找到从安装程序包执行此操作的方法,或者告诉我使用 regasm,但我找不到任何有关如何以编程方式执行此操作或是否可能的信息。

提前感谢您对此提供的任何帮助。

EDIT 5/10/2013:看起来将 EXE 注册为 COM 对象与注册 DLL 不同。 .NET 中是否有编程方式(PInvoke 很好)将 EXE 注册为 COM 对象(在 32 位注册表中)?这就是我们目前在脚本中的做法,应用程序和 REGCMD 变量只是简写:

    set app=%PathToTheExecutable%
    set REGCMD=%PathTo32BitRegExe%
    "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm" /tlb /codebase %app%
    %REGCMD% ADD HKCR\CLSID\{app-guid}\LocalServer32 /ve /t REG_SZ /d %app% /f
    %REGCMD% DELETE HKCR\CLSID\{app-guid}\InprocServer32 /f

基本上我们在可执行文件上运行 regasm,然后将我们的 exe 添加为 LocalServer32 并删除将我们关联为 InprocServer 的条目。是否可以通过编程方式执行此操作而无需从代码中调用 regasm?

最佳答案

您可以在 C# 中执行此操作 - 但只能通过使用一些 pinvoke,特别是 LoadLibrary/GetProcAddress/FreeLibrary。

基本上您需要加载 DLL,调用该 DLL 中的注册/取消注册函数,然后卸载它。

有关包括工作 C# 源代码的完整演练,请参阅 here .引用见MSDN根据评论。

在 OP 更新问题后更新:

上述方法只适用于DLL。

对于程序集(尤其是在 .NET 中实现的 EXE COM 服务器),最简单和最可靠的选择实际上是使用 regasm

如果您确实需要以编程方式执行此操作,您应该查看这些 MSDN 链接:

基本上您需要通过 Assembly.Load 加载您的 EXE,然后在相关的 Type 上调用 RegisterTypeForComClients

另一种选择是动态地(在运行时)执行此操作 - 也许是 this对你有些用处...

关于c# - 如何从 C# 将 EXE 注册/取消注册为 COM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463498/

相关文章:

c# - 如何更改 win32 窗口上的文本?

c# - Shell32.Folder.GetDetailsOf(..,..) 有哪些可用选项?

c++ - VSS 硬件供应商

c# - 以编程方式查找sql​​ server的所有实例

c# - 在 C# 中使用 XElement 获取 XML 的元素节点值

.net - 在 32 位 Visual Studio 的同时在 64 位机器上进行调试

C# COM 对象和 CreateDispatch

c# - 一个正则表达式,允许一个字符串只有一个大写字母

c# - LINQ 查询将数据放入嵌套对象中

c# - 从 XML 序列化数组中删除包装元素