我有一个第三方应用程序,我正在使用我的C#桌面代码。我使用了制造商提供的库中的几个接口。该库由许多DLL组成,我为其访问一个DLL。 我发现当他们发布新版本的应用程序时,我遇到了一些问题。
安装代码将我在开发计算机上引用的DLL复制到项目bin文件夹中。我通过在实现接口的concreate实例之前临时添加DLL的路径而不是在构建期间复制它来修复它。
现在的问题是我无法创建自己的对象。错误是:
Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’.
我认为这是因为我的源代码引用了不同版本的DLL。当程序运行时,它知道它与编译时的不一样。即使版本之间的签名相同,公钥标记也是相同的。
我直观地比较了我在VS对象资源管理器中使用的接口的签名,并且它们匹配。
我尝试了另一种方法,将较新的DLL复制到我的机器上的文件夹中并引用该文件夹。编译后,我在计算机上出现了转换错误,它在测试计算机上运行。
我认为这会起作用,否则Binding Redirect如何工作呢?
我想过手动加载程序集,但是我如何访问这些方法呢?看看查找方法似乎并不容易。我是否必须创建自己的界面和适配器才能将它们映射到我的界面,所以我会查看一次?
答案 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,所以我必须手动将其添加到安装程序的安装文件列表中。从长远来看,这个模块是可选的,可能不需要这种依赖,因此我不想将它添加到主项目的引用中。