是否可以在运行时将System.Data.SqlServerCe 4.0.0.0与版本4.0.0.1交换?

时间:2011-05-20 23:40:31

标签: c# dll assemblies sql-server-ce assemblybinding

我的应用程序引用了一个以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,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT的例外情况:0X80131040)

问题

是否可以在运行时将System.Data.SqlServerCe 4.0.0.0与版本4.0.0.1交换以允许私有部署?

2 个答案:

答案 0 :(得分:3)

您是否尝试删除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 :(得分:1)

我认为如果版本号不同而没有重新编译,你就不能交换程序集。

抱歉,无论如何,我的回答看起来都不正确。我只知道在构建时创建的程序集清单中的静态引用。

ErikEJ的回答对于您要做的事情似乎是正确的。另外我认为你不需要在assemblyIdentity中使用* .dll。从我阅读的文档中,只有当您尝试引用相对于应用程序的另一个文件夹中的远程程序集或程序集时,才需要codeBase。

如果这不起作用,您可以尝试删除assemblyIdentity元素的publicKeyToken属性,或者通过从VS命令行运行“sn -T System.Data.SqlServerCe.dll”来验证公钥。