Ben*_*est 3 .net c# com regasm
编辑5/11/2013:这个问题最初询问如何使用.NET中的代码以编程方式注册COM对象,而不必使用REGASM.Yahia的答案涵盖了如何以编程方式注册DLL和EXE.
原始问题:目前,我们有一个批处理脚本,我们从UI调用,在设置默认版本(使用regasm和添加注册表项)时在COM中注册/取消注册我们的软件.我们不再希望使用批处理脚本,因为我们遇到了一个问题,如果脚本失败,程序就不会意识到失败.有几种方法可以解决这个问题,但我不喜欢从代码调用批处理脚本的概念,如果我不需要,所以我想切换到使用托管代码向COM注册我们的软件.
假设它是可能的,你如何从C#注册/注销COM对象?谷歌搜索只能找到从安装程序包中执行此操作的方法,或者告诉我使用regasm,但我无法找到有关如何以编程方式执行此操作的任何信息,或者甚至是否可能.
在此先感谢任何帮助.
编辑5/10/2013:将EXE注册为COM对象看起来与注册DLL不同..NET中是否有一种编程方式(PInvoke很好)将EXE注册为COM对象(在32位注册表中)?这是我们目前在脚本中的做法,app和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
Run Code Online (Sandbox Code Playgroud)
基本上我们在可执行文件上运行regasm,然后将我们的exe作为LocalServer32添加并删除将我们关联为InprocServer的条目.是否有可能以编程方式执行此操作而无需从代码中调用regasm?
你可以在C#中做到这一点 - 但只能使用一些pinvoke,特别是LoadLibrary/GetProcAddress/FreeLibrary.
基本上你需要加载DLL,调用该DLL中的注册/取消注册函数然后卸载它.
有关完整的演练,包括工作C#源代码,请参见此处.参考资料根据评论参见MSDN.
OP更新后更新问题:
上述方法仅适用于DLL.
使用Assemblies(特别是在.NET中实现的EXE COM服务器),实际上可以使用最简单,最强大的选项regasm.
如果您确实需要以编程方式执行此操作,则应该查看这些MSDN链接:
基本上你需要加载EXE Assembly.Load,然后调用RegisterTypeForComClients相关的Types.
另一种选择是动态地(在运行时)这样做 - 也许这对你有用...