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

yduiuuwa  于 2023-06-25  发布在  .NET
关注(0)|答案(4)|浏览(178)

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

wtlkbnrh

wtlkbnrh1#

您需要使用构建定义的process参数中的MSBuildArguments选项将以下值传递给MSBuild。

/p:RegisterForComInterop=false

rxztt3cl

rxztt3cl2#

我想到了一个办法让它工作!如果查看项目中的XML,您会看到如下所示的节点:

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

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

kg7wmglp

kg7wmglp3#

您的TFS构建代理可能正在某个服务帐户下运行,因此该帐户需要提升的特权。您需要将服务帐户添加到生成服务器上的管理员组。
但是,您的TFS管理员可能不想这样做。即使给帐户额外的权限不是问题,他们也可能会对您的构建对注册表进行“操作”有问题。
can call COM components from c++ without needing to register them
This article上注册免费COM去更多细节

tcomlyy6

tcomlyy64#

我也发现了这个症状,但这是因为Windows更新公开根据公司的政策,并遵循JonesCola的建议。

相关问题