У меня очень большой проект, который использует Oracle ODP.NET. Прямо сейчас это сборка против версии 10.1.0.401 (которая на данный момент является довольно старой версией). Это работает как на моей машине разработчика, так и на машине сборки. На сборочном компьютере не установлена Visual Studio, а используется MSBuild непосредственно для файла решения.
Я пытаюсь установить новую версию ODP на моей машине разработчика. Однако я не хочу влиять на других разработчиков или сборочную машину. Я хочу позволить людям обновлять версии в разное время, и я не могу обновить сборочную машину, пока не обновятся наши веб-серверы (корпоративная среда - это займет месяцы).
Прямо сейчас в системе контроля версий ссылка на Oracle.DataAccess в файле * .csproj выглядит следующим образом:
<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?