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

时间:2013-05-09 13:56:33

标签: c# .net com regasm

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

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

假设有可能,您如何从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?

2 个答案:

答案 0 :(得分:7)

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

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

有关包含C#源代码的完整演练,请参阅here。参考文献请参阅MSDN

OP更新问题后更新:

上述方法仅适用于DLL。

使用Assemblies(特别是在.NET中实现的EXE COM服务器),最简单,最强大的选项实际上是使用regasm

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

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

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

答案 1 :(得分: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'。