为什么两个程序集中的相同COM引用可能在构建时导致CS1502和CS1503错误

本文关键字:构建 错误 CS1503 CS1502 引用 COM 两个 程序 程序集 集中 为什么 | 更新日期: 2023-09-27 18:06:46

我目前正在与一些遗留代码作斗争(我真诚地希望这些代码将在最近的将来退役)。不幸的是,到目前为止,仍然有一些地方的下游代码期望接收ADODB。记录集对象。

导致该问题的解决方案包括需要引用adodbcom库的多个程序集。在所有这些程序集中,使用Visual Studio(最初是2013年,随后是2015年)添加了对ADODB V6.1的引用,并在csproj文件中产生以下元素:

<COMReference Include="ADODB">
  <Guid>{B691E011-1797-432E-907A-4D8C69339129}</Guid>
  <VersionMajor>6</VersionMajor>
  <VersionMinor>1</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>False</EmbedInteropTypes>
</COMReference>

不幸的是,似乎即使Guid是相同的,版本信息也是相同的,但引用的类型被解释为不同的地方,导致构建时出现以下错误:

[SomeFile].cs(54,17):错误CS1502: 'Rhino.Mocks.Interfaces.IMethodOptions.Return(ADODB.Recordset)'的最佳重载方法匹配有一些无效参数[SomeProjectFile.csproj][SomeFile].cs(54,25):错误CS1503:参数1:无法从ADODB转换。Recordset [[AssemblyRoot]'obj'debug'Interop.ADODB.dll]' to 'ADODB. dll。记录集的[SomeProjectFile.csproj]

在我看来,似乎Visual Studio/MSBuild正在变得困惑,并相信引用是不同的(因此可能不兼容)版本的COM库。我不明白为什么。有什么建议吗?

为什么两个程序集中的相同COM引用可能在构建时导致CS1502和CS1503错误

我刚刚有了一个头脑风暴…结果证明是正确的。造成这种情况的根本原因似乎是非常不受欢迎的代码签名特性。其中一个包含ADODB引用的程序集(实际上作为我们产品的一部分分发的程序集)被签名。生成失败的程序集(包含第一个程序集的单元测试)未签名。我的猜测是,即使引用的COM组件在两个地方都是相同的,库引用(可能是由TLBImp.exe在幕后生成的)在一个地方签名,而在另一个地方没有签名,导致不匹配和相关的构建错误。使用与它们测试的程序集相同的密钥对有问题的测试程序集签名,允许该部分构建成功。