我有一个与C#桌面代码一起使用的第三方应用程序。我在制造商提供的库中使用了几个界面。该库由许多DLL组成,我访问了一个界面。我发现,当他们发布新版本的应用程序时,我有两个问题。
安装代码复制了我在开发机上引用的DLL到项目bin文件夹。我通过在实现界面的具体实例并在构建过程中不复制它之前暂时添加DLL的路径来解决该问题。
现在的问题是我无法创建他们的对象。错误是:
Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’.
我认为这是因为我的源代码引用了DLL的不同版本。当该程序运行时,它知道它与编译不相同。即使版本之间的签名和公共密钥令牌是相同的。
是相同的。我在视觉上比较了我在VS Object Explorer中使用的接口的签名,并且它们匹配。
我尝试通过将较新的DLL复制到我的计算机上的文件夹中并引用该文件来尝试另一种方式。编译后,我在计算机上遇到了铸件错误,并且在测试计算机上起作用。
我认为这会起作用,否则绑定重定向如何工作?
我考虑过手动加载组件,但是如何访问方法?查看查找方法似乎并不容易。我是否必须创建自己的界面和适配器才能映射它们的矿山,以便我查找一次?
可以用较旧的汇编的界面编译.NET应用程序使用较新版本创建对象?
如果第三方公司将一个组件分开,一个用于持有界面,另一个用于持有代码,则可以做您想做的。
但是,由于它们没有,因此接口标记为特定版本,因此您会在名称/名称空间相同的情况下得到铸造错误。
安装代码复制了我在开发机上引用的DLL到项目bin文件夹。
安装到不同位置无济于事,也无需加载。您已经提到创建一个围绕的工作本身就是一个项目。
唯一的选择是将代码更新为新版本,或者根本不更新。
解决方案是在主应用程序的app.config中使用bindingredect。反映了我编译程序时引用的汇编版本。
我曾尝试将其放在引用目标组件的项目的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未在主要可执行文件中引用,所以我必须手动将其添加到安装程序的设置文件列表中。从长远来看,此模块将是可选的,并且可能不需要此依赖项,因此我不想将其添加到主项目的参考文献中。