tfs 生成错误 无法注册程序集"MyAssembly.dll" - 访问被拒绝

tfs build error Cannot register assembly "MyAssembly.dll" - access denied

本文关键字:dll MyAssembly 访问 拒绝 程序集 错误 注册 tfs      更新时间:2023-10-16

我有一个C#web服务项目。我创建了一个客户端,用于创建和管理与服务的连接。我们有一个用C++编写的旧版PC产品,他们需要有一个接口来调用该服务。我在客户端上为它们创建了一些调用,并使COM可见的新对象可以传递数据。然后,我选中项目设置中的"注册COM互操作"复选框。这一切似乎都是在本地构建和工作的(我以管理员的身份运行visualstudio)。但是,当我在TFS服务器上签入时,生成失败,并声明:无法注册程序集"MyClient.dll"-访问被拒绝。请确保您以管理员身份运行应用程序。拒绝访问注册表项"HKEY_CLASSES_ROOT\MyClient.MyClass"。有没有办法在构建机器上提升我的令牌,或者其他方法来解决这个问题?

您需要使用生成定义的进程参数中的MSBuild Arguments选项将以下值传递给MSBuild。

/p:RegisterForComInterop=false

我找到了一种工作方法!如果您查看项目中的XML,您会看到一个如下所示的节点:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' ==  'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <OutputPath>binDebug</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
     <PlatformTarget>x86</PlatformTarget>
     <UseVSHostingProcess>false</UseVSHostingProcess>
     <RegisterForComInterop>true</RegisterForComInterop>    
</PropertyGroup>

这里的问题当然是告诉项目注册com互操作的行。我还看到了发布配置的类似定义。我可以通过删除行或通过UI取消复选框来解决这个问题,但我的项目中有其他人需要获得代码,如果源代码管理中的项目版本对他们有效会更好。答案是取消选中发布定义上的registerinterop框,但将其保留在调试定义上,然后将生成TFS定义更改为仅为发布而生成。这样,我的同事就可以拥有com对象,构建服务器也不会抱怨。

您的TFS构建代理可能在服务帐户下运行,因此该帐户需要提升权限。您需要将服务帐户添加到生成服务器上的管理员组中。

但是,您的TFS管理员可能不想这样做。即使给予帐户额外的权限不是问题,他们也可能会对您的构建对注册表进行"操作"产生问题。

您可以从c++调用COM组件,而无需注册

这篇关于Registration Free COM的文章更详细地介绍了

我也发现了这个症状,但这是因为windows根据公司的政策进行了公开更新,并得到了JonesCola的推荐。