3

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

原始问题:目前,我们有一个批处理脚本,当设置默认版本(使用 regasm 并添加注册表项)时,我们从 UI 调用以在 COM 中注册/取消注册我们的软件。我们不再希望使用批处理脚本,因为我们遇到了一个问题,如果脚本失败,程序不会意识到失败。有几种方法可以解决这个问题,但我不喜欢在不需要时从代码中调用批处理脚本的想法,所以我想切换到使用托管代码向 COM 注册我们的软件。

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

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

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

    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?

4

2 回答 2

7

您可以在 C# 中做到这一点 - 但只能通过使用一些 pinvoke,特别是 LoadLibrary / GetProcAddress / FreeLibrary。

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

有关包含工作 C# 源代码的完整演练,请参见此处。根据评论参考MSDN 。

OP更新问题后更新:

上述方法仅适用于 DLL。

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

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

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

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

于 2013-05-09T14:12:42.653 回答
1
var proc = System.Diagnostics.Process.Start("regsvr32", "msxml6.dll /s");
proc.WaitForExit();
Console.WriteLine(proc.ExitCode);

proc = System.Diagnostics.Process.Start("regasm", name+" /silent");
proc.WaitForExit();
Console.WriteLine(proc.ExitCode);

现在您有了退出代码,即注册的结果。在 msxml6 上的测试有一个成功的退出代码“0”,当我把它命名为“3”时退出代码很糟糕。

于 2013-05-09T14:07:36.797 回答