使用CodeActivity从TFS Build注册DLL

时间:2011-01-12 14:24:32

标签: .net vb.net tfs

我正在尝试创建一个CodeActivity对象,该对象将在TFS构建期间在远程系统上注册DLL。我成功模仿了我自己的用户帐户,该帐户拥有我的计算机的管理员权限。 (我现在正试图在我的机器上注册DLL。)请注意,如果我在本地运行工作流,但不是从构建服务器运行,所有尝试都有效。此外,如果我手动运行regsvr32,DLL将正确注册和取消注册。

这是我正在使用的高度精简的代码:

Private DllType As Type 'Type of the DLL being registered is handled elsewhere'
Dim Result As Integer
Result = CInt(DllType.InvokeMember("DllUnregisterServer", BindingFlags.InvokeMethod, Nothing, Activator.CreateInstance(DllType), Nothing))

当我运行它时,我收到此消息,最相关的可能是内部异常,“无法在DLL'RptBarcodeLabel.dll中找到名为'DllUnregisterServer'的入口点”

  

错误=调用目标抛出异常。,stack = at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo方法,Object target,Object []参数,SignatureStruct& sig,MethodAttributes methodAttributes,RuntimeType typeOwner)      在System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo方法,Object target,Object []参数,Signature sig,MethodAttributes methodAttributes,RuntimeType typeOwner)      at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture,Boolean skipVisibilityChecks)      在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)      at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams)      at System.Type.InvokeMember(String name,BindingFlags invokeAttr,Binder binder,Object target,Object [] args)      at TfsCopyFile.DllRegServer.InternalRegServer(Boolean fUnreg)      在TfsCopyFile.DllRegServer.UnRegister()      在TfsCopyFile.TfsRegisterDLL.Execute(CodeActivityContext context),内部异常=无法在DLL'RptBarcodeLabel.dll'中找到名为'DllUnregisterServer'的入口点。

远程注册DLL的另一种方法也可能有用 - 我愿意接受建议,只要在从TFS构建过程中可以触发该过程。

1 个答案:

答案 0 :(得分:0)

这是我为类似要求采取的方法:

在TFSBuild.proj中,使用Exec操作在部署服务器上动态创建.bat文件;批处理文件由PsExec远程执行。此示例创建一个批处理文件来运行msiexec,但您可以轻松地将其更改为使用regsvr32注册dll。

<Exec Condition="'$(DeploymentServer)'!=''" Command='echo @echo off >"\\$(DeploymentServer)\C$\Temp\Install.bat"' ContinueOnError="true" />
<Exec Condition="'$(DeploymentServer)'!=''" Command='echo start /wait msiexec /uninstall "{98056358-8984-4554-b0c3-9f2af248a029}" /passive /log "C:\Temp\Uninstall.log" >>"\\$(DeploymentServer)\C$\Temp\Install.bat"' ContinueOnError="true" />
<!-- Kill the psexec service, otherwise it never terminates. -->
<Exec Condition="'$(DeploymentServer)'!=''" Command='echo taskkill /IM PSEXESVC.EXE >>"\\$(DeploymentServer)\C$\Temp\Install.bat"' ContinueOnError="true" />
<Exec Condition="'$(DeploymentServer)'!=''" Command='"C:\Program Files\Sysinternals\psexec" -accepteula \\$(DeploymentServer) -u myuser -p mypassword -w "C:\Temp" "C:\Temp\Install.bat"' ContinueOnError="true" />

如果您不使用像psexec这样的东西,那么在尝试在远程服务器上执行命令时,您可能会遇到权限等问题。