我有一个C#Web服务项目。我创建了一个客户端,用于创建和管理与服务的连接。我们有一个用C ++编写的旧PC产品,他们需要有一个接口来调用服务。我在客户端为它们创建了一些调用,并使COM可见的新对象可以传递数据。然后,我检查项目设置中的“注册COM互操作”框。这一切似乎都在本地构建和工作(我作为管理员运行visual studio)。但是当我在我的TFS服务器上签入时,构建失败说明:无法注册程序集" MyClient.dll" - 拒绝访问。请确保您以管理员身份运行该应用程序。访问注册表项' HKEY_CLASSES_ROOT \ MyClient.MyClass'被拒绝。 有没有办法在构建机器上提升我的令牌或以其他方式来解决这个问题?
答案 0 :(得分:11)
您需要使用构建定义的process参数中的MSBuild Arguments选项将以下值传递给MSBuild。
<强> / P:RegisterForComInterop =假强>
答案 1 :(得分:8)
我找到了一种工作方式!如果查看项目中的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 interop的行。我还看到了发布配置的类似定义。我可以通过删除行来解决问题,或者通过UI取消选中该框但我在项目中有其他人需要获取代码,如果源代码管理中的项目版本对他们有效会更好。答案是取消选中发布定义上的寄存器互操作框,但将其保留在调试定义中,然后将构建TFS定义更改为仅构建用于发布。这样,我的同事可以拥有com对象,而构建服务器也不会抱怨。
答案 2 :(得分:1)
您的TFS构建代理可能在服务帐户下运行,因此该帐户需要提升权限。您需要将服务帐户添加到构建服务器上的管理员组。
但是您的TFS管理员可能不想这样做。即使为帐户提供额外的权限也不是问题,但他们可能会遇到您的构建问题,而且问题是&#34;到注册表。
你can call COM components from c++ without needing to register them
关于注册免费COM的This article进入更多细节