使用旧程序集的Interface编译的.Net应用程序是否可以使用较新版本创建对象?

时间:2017-05-01 14:05:04

标签: .net .net-assembly

我有一个第三方应用程序,我正在使用我的C#桌面代码。我使用了制造商提供的库中的几个接口。该库由许多DLL组成,我为其访问一个DLL。 我发现当他们发布新版本的应用程序时,我遇到了一些问题。

安装代码将我在开发计算机上引用的DLL复制到项目bin文件夹中。我通过在实现接口的concreate实例之前临时添加DLL的路径而不是在构建期间复制它来修复它。

现在的问题是我无法创建自己的对象。错误是:

Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’.

我认为这是因为我的源代码引用了不同版本的DLL。当程序运行时,它知道它与编译时的不一样。即使版本之间的签名相同,公钥标记也是相同的。

我直观地比较了我在VS对象资源管理器中使用的接口的签名,并且它们匹配。

我尝试了另一种方法,将较新的DLL复制到我的机器上的文件夹中并引用该文件夹。编译后,我在计算机上出现了转换错误,它在测试计算机上运行。

我认为这会起作用,否则Binding Redirect如何工作呢?

我想过手动加载程序集,但是我如何访问这些方法呢?看看查找方法似乎并不容易。我是否必须创建自己的界面和适配器才能将它们映射到我的界面,所以我会查看一次?

2 个答案:

答案 0 :(得分:0)

  

使用较旧的程序集界面编译的.Net应用程序是否可以使用较新版本创建对象?

如果第三方公司拆分了程序集,一个用于保存接口,另一个用于保存代码,则可以执行您想要的操作。

但是因为它们没有,所以界面被标记为特定版本,因此您会得到名称/命名空间相同的转换错误。

  

安装代码将我在开发计算机上引用的DLL复制到项目bin文件夹。

安装到不同的位置不会有帮助,也无法加载。您已经提到创建一个项目本身就是一个项目。

唯一的选择是将代码更新为新版本,或者根本不更新。

答案 1 :(得分:0)

解决方案是在主应用程序的App.Config中使用BindingRedirect,它反映了我在编译程序时引用的程序集的版本。

我曾尝试将它放在引用目标程序集的项目的App.Config中,但这没有明显的效果。将XML块移动到主可执行文件App.Config使其工作。

<configuration>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="SDK.NET.Interface"
                          publicKeyToken="865eaf3445b2ea56"
                          culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535"
                         newVersion="17.1.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

旁注。因为在主可执行文件中未引用引用的dll,所以我必须手动将其添加到安装程序的安装文件列表中。从长远来看,这个模块是可选的,可能不需要这种依赖,因此我不想将它添加到主项目的引用中。