我有一个使用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中,因此它不是我所能说的合理错误。
更新
这在某种程度上与DLL在GAC中有关。如果我在本地拥有DLL并更改引用,因此它包含一个HintPath到该本地文件,那么该东西编译得很好。将SpecificVersion = False与GACed程序集结合起来是不合适的?
答案 0 :(得分:3)
我也在使用这个程序集。我们从项目目录树中的“Assemblies”文件夹引用此程序集,并具有特定的version = 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>
它正在运行,因为所有团队成员的计算机上都安装了相同的版本。在构建服务器上有不同的情况。我不记得为什么,但我必须将程序集绑定重定向添加到machine.config for Oracle assemby,以使我的构建工作在64位构建服务器上。
这可能是由新的ODP.NET引起的,其中两个Oracle.DataAccess程序集已安装到GAC中。一个用于.NET 4.0,版本为4.xx,第二个用于版本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问题,但这个程序集重定向很有帮助。