Целевая не конкретная версия сборки - PullRequest
4 голосов
/ 20 июля 2010

Я пытаюсь не нацеливаться на конкретную версию DLL, но я не совсем уверен, как. Я установил для параметра «Определенная версия» в свойствах сборки значение «ложь», однако, если я пытаюсь запустить приложение, а версия запрашиваемой сборки является предыдущей, я получаю:

FileLoadException: Could not load file or assembly 

Это происходит, когда версия dll, на которую ссылаются, точно не соответствует текущей. Я полагаю, что вопрос в том, как ссылаться на эту сборку.

Ответы [ 4 ]

3 голосов
/ 26 июля 2010

В общем, если вы пытаетесь использовать конкретную версию сборки, приведенную ниже, на самом деле не относится, вам следует просто использовать нужную версию.

Однако иногда вы можете столкнуться с ситуацией, когда у вас есть это:

AssemblyX - ссылка на версию 1.2.1 AssemblyZ
AssemblyY - ссылка на версию 1.2.2 AssemblyZ

Но вашему проекту нужны оба AssemblyX и AssemblyY.

Так как вы решаете это? Вы можете поместить 1.2.1 и 1.2.2 AssemblyZ в GAC, или, если вы уверены, что нет проблем с совместимостью, вы можете использовать привязку сборки. Вот пример (это идет в вашем файле Web.config или App.config):

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

В сущности, это говорит о том, что если какие-либо сборки в вашем решении ссылаются на 1.0.0.0 myAssembly, то они действительно должны использовать версию 2.0.0.0. Ожидается, что в пути будет версия 2.0.0.0.

Хак, который вы можете использовать, когда всегда хотите, чтобы они использовали определенную версию сборки, - это указать диапазон версий, например:

        <dependentAssembly>
            <assemblyIdentity name="MyAssembly" publicKeyToken="B7567367622062C6" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="1.2.1.0" />
        </dependentAssembly>

Это заставит использовать версию MyAssembly 1.2.1.0 для любой ссылки на версию MyAssembly в диапазоне от 0.0.0.0 до 3.0.0.0.

0 голосов
/ 21 января 2014

Хотя приведенный ниже пример кода для App.Config верен, вы можете не позволить политике GAC переопределить ваше желание, добавив следующее значение publisherPolicy apply = "no" в любое из дерева assemblyBinding, которое заставит все сборки игнорировать издателя GACили вы можете поместить publisherPolicy apply = "no" /> в дереве зависимых сборок, и это будет проходить мимо pubisherPolicy только для этой сборки.

   { <configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <publisherPolicy apply="no" /> // This applies to the whole application - all references
         <dependentAssembly>
         <publisherPolicy apply="no" /> // This applies only to this assembly
            <assemblyIdentity name="AssemblyName"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>}

Для получения дополнительной информации см .: Ссылка MSDN

0 голосов
/ 16 октября 2013

Вы можете иметь как dll, так и использовать bindingRedirect, как показано ниже:

dll-версия в dotnet

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="AssemblyName"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>
0 голосов
/ 26 июля 2010

единственные пути решения этой проблемы, которые я нашел до сих пор:

1) ILMerge dll с зависимостью, которая у меня есть 2) обеспечение зависимости (в данном случае dll) 3) не вход в сборку, хотя это было бы довольно сложно, потому что мне нужно "подписать" иерархию

...