Можно ли поменять местами System.Data.SqlServerCe 4.0.0.0 с версией 4.0.0.1 во время выполнения? - PullRequest
2 голосов
/ 21 мая 2011

Мое приложение ссылается на библиотечный проект с зависимостью System.Data.SqlServerCe 4.0.0.0.

Однако я пытаюсь развернуть приложение в частном порядке, для чего требуется System.Data.SqlServerCe 4.0.0.1.

Итак, я настроил свое приложение так, чтобы System.Data.SqlServerCe 4.0.0.1 копировался в выходной каталог (в ту же папку, что и исполняемый файл), и я добавил AssemblyBinding в мой файл App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  ...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity
          name="System.Data.SqlServerCe.dll"
          publicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="4.0.0.0" newVersion="4.0.0.1" />
        <codeBase version="4.0.0.1" href="System.Data.SqlServerCe.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

К сожалению, я получаю эту ошибку:

Не удалось загрузить файл или сборку 'System.Data.SqlServerCe, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 89845dcd8080cc91' или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0X80131040)

Вопрос

Можно ли заменить System.Data.SqlServerCe 4.0.0.0 на версию 4.0.0.1 во время выполнения, чтобы разрешить частное развертывание?

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

Вы пытались удалить тег CodeBase: http://blogs.msdn.com/b/sqlservercompact/archive/2010/05/12/troubleshooting-problem-with-private-deployment-of-sql-server-compact-3-5sp2-entity-dll.aspx Похоже, вам также следует удалить .dll из имени. Приведенный ниже файл конфигурации может заставить Exportsqlce40.exe работать с закрытыми dll-файлами (они должны быть в той же папке, что и .exe):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="4.0.0.0" newVersion="4.0.0.1" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
1 голос
/ 21 мая 2011

Я не думаю, что вы можете поменять сборки, когда номера версий отличаются без перекомпиляции.

Извините, похоже, мой ответ был неверным в любом случае.Я знал только о статических ссылках в манифесте сборок, созданных во время сборки.

Ответ ErikEJ кажется правильным для того, что вы хотите сделать.Также я не думаю, что вам нужен * .dll в AssemblyIdentity.Из документации, которую я прочитал, codeBase требуется только в том случае, если вы пытаетесь сослаться на удаленную сборку или сборку в другой папке, относящейся к вашему приложению.

Если это не сработает, вы можете попробовать удалить атрибут publicKeyTokenдля элемента assemblyIdentity или проверьте открытый ключ, запустив «sn –T System.Data.SqlServerCe.dll» из командной строки VS.

...