2011-05-18 91 views
1

我对几个COM组件有依赖关系。我的项目是托管的。我想确保最新版本的COM DLL是预先注册的。我已经在预构建步骤中在DLL中添加了regsvr32调用,但它似乎永远不能正常工作。项目建成时,它抱怨该类型没有注册。我有孤立和非孤立的组件。C# - 在预生成事件期间注册第三方COM DLL

人们如何处理这种情况? regsvr32是唯一的答案吗?为什么MSBuild没有注意到这些类型已被注册?

+0

我想到的问题是:这些依赖关系是否真的发生了变化,以至于它们必须作为预构建步骤进行注册?如果项目尚未注册,那么该项目如何开发以引用它们?你是在做这个来配置自动构建,还是从IDE内部构建? – 2011-05-18 17:14:10

+0

regsvr32的返回值是多少?你需要提升(使用UAC运行Vista/Win7)吗? – Richard 2011-05-18 17:14:38

+0

@Joel - 在干净的环境中拉伸干净的构建会导致这种类型的失败。在一个大型项目中,即使它是多余的,你也确实需要这种类型的东西。我会做类似的事情,以便构建可以在一个步骤中执行。 – 2011-05-18 17:17:30

回答

1

Regsvr32是在注册表中注册您的typelib和COM服务器信息的方式。这是一个微不足道的过程,我很惊讶它不起作用。你是否已经手工验证过程,以确保它不是别的,比如为regsvr32提供了错误的路径?

+0

好的....现在我可能已经失败了,我已经把它弄糊涂了一点。如果该路径对DLL无效,那么构建将会成功,但是regsvr32会静默失败。发生这种情况时,如何使构建失败?如果交换机错误,构建失败,但如果文件路径错误则构建失败。 – 2011-05-18 17:24:46

+0

@Adam - 如果有人因为导致运行时问题并且不会构建问题而丢弃路径,我不会失败。我将它看作类似于让某些人混淆构建工件的输出路径。这并不是真正意义上的构建失败。 – 2011-05-18 18:03:00

+0

我绝对认为这是一个构建问题。该DLL未正确注册,因此C#程序集无法构建,因为它不知道COM DLL的位置。由于注册失败而未能建立,只会更快地发现问题。 – 2011-05-18 18:08:53

0

我通过调用批处理脚本解决了这个问题:

$(ProjectDir)register.bat "$(SolutionDir)" 

批次:

regsvr32 "%~1ThirdParty\comdll1.dll" /s 
if %ERRORLEVEL% NEQ 0 GOTO Exit 
regsvr32 "%~1ThirdParty\comdll2.dll" /s 
if %ERRORLEVEL% NEQ 0 GOTO Exit 
regsvr32 "%~1ThirdParty\comdll3.dll" /s 
EXIT: 

的问题是,Visual Studio可以只检查ERRORLEVEL值一次,在最后。如果comdll2注册失败,但comdll3成功,那么ERRORLEVEL将为0,并且构建不会失败。