.net - SpecificVersion false 导致编译错误

标签 .net reference msbuild version

我有一个使用 Oracle ODP.NET 的非常大的项目。现在它是针对版本 10.1.0.401 构建的(目前这是一个相当旧的版本)。这在我的开发机器和构建机器上都有效。构建计算机未安装 Visual Studio,而是直接针对解决方案文件使用 MSBuild。

我正在尝试在我的开发人员计算机上安装新版本的 ODP。但是,我不想影响其他开发人员或构建机器。我希望允许人们在不同时间升级版本,并且在我们的 Web 服务器升级之前我无法升级构建机器(企业环境 - 这将需要几个月的时间)。

现在,在源代码管理中,*.csproj 文件中的 Oracle.DataAccess 引用如下所示:

<Reference Include="Oracle.DataAccess, Version=10.1.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342" />

因此 SpecificVersion 设置为 true,并且 10.1.0.401 位于构建计算机上的 GAC 中。这构建得很好。所以我想我只需将 SpecificVersion 的引用更改为 false,然后提交即可。在我的计算机上,引用将解析为新版本,而在构建计算机上,它将继续解析为 10.1.0.401。因此,我对文件进行了更改,如下所示:

<Reference Include="Oracle.DataAccess, Version=10.1.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342">
  <SpecificVersion>False</SpecificVersion>
</Reference>

不知何故,这会导致生成服务器上的 MSBuild 执行编译失败。错误是:

"C:\path\to\MySolution.sln" (Rebuild target) (1) ->
"C:\path\to\my\project.csproj" (Rebuild target) (2) -> 
  (CoreCompile target) ->
  My\ClassFile.cs(241,67): error CS1061: 'Oracle.DataAccess.Client.OracleConnection' does not contain a definition for 'EnlistDistributedTransaction' and no extension method 'EnlistDistributedTransaction' accepting a first argument of type 'Oracle.DataAccess.Client.OracleConnection' could be found (are you missing a using directive or an assembly reference?) [C:\path\to\my\project.csproj]

如果根本找不到 Oracle.DataAccess 对我来说是有意义的,但我如何得到有关缺少 API 的编译错误?请注意,该 API 存在于 ODP 10.1.0.401 中,因此据我所知,这不是一个合法错误。

更新:
这在某种程度上与 GAC 中的 DLL 有关。如果我在本地有 DLL 并更改引用,使其包含该本地文件的 HintPath,那么编译就可以正常。将 SpecificVersion = False 与 GACed 程序集结合起来是否不合适?

最佳答案

我也在使用这个组件。我们从项目目录树内的“Assemblies”文件夹中引用此程序集,具体版本 = false。

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\Assemblies\Llblgen\Oracle.DataAccess.dll</HintPath>
</Reference>

它之所以有效,是因为所有团队成员的计算机上都安装了相同的版本。在构建服务器上存在不同的情况。我不记得为什么,但我必须将程序集绑定(bind)重定向添加到 Oracle 程序集的 machine.config 中,以使我的构建在 64 位构建服务器上运行。

这可能是由新的 ODP.NET 引起的,其中两个 Oracle.DataAccess 程序集安装到了 GAC 中。第一个用于版本 4.xx 的 .NET 4.0,第二个用于版本 2.111.xx。我使用 MSBuild 4.0 (TFS2010) 编译源代码(我们的项目针对 .NET3.5),它总是尝试从 GAC 加载 4.xx 版本而不是 2.xx 版本。

我通过更新 machine.config 文件之一解决了这个问题:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral" />
        <bindingRedirect oldVersion="2.102.0.0-2.120.0.0" newVersion="2.112.2.0" />
      </dependentAssembly>
    </assemblyBinding>
</runtime>

抱歉,我不太记得构建服务器上的 Oracle 问题,但此程序集重定向很有帮助。

关于.net - SpecificVersion false 导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9295237/

相关文章:

javascript - 无法在 React Native 中使用 useRef() 将 current.focus() 应用于按钮

MSBuild 迭代带标签的 PropertyGroup 中的属性并检索名称和值

asp.net - SlowCheetah 未在 CI 服务器上生成转换后的配置文件

c# - 哪个集合类对于在 C# 中插入是有效的

c# - .net 中的自定义属性和异常

.net - 如何从WCF服务返回流?

c# - 如何在同一站点的 ashx 和 aspx 文件中使用 await/async?

c++ - 在同一指令中引用和取消引用

java - 引用数组引发与扫描仪有关的错误

.net - 'GenerateBindingRedirectsOutputType' 选项有什么作用?