使用较旧程序集的接口编译的 .Net 应用程序能否创建具有较新版本的对象?
Can a .Net application compiled with an older assembly's Interface create objects with a newer version?
我有一个与我的 C# 桌面代码一起使用的第 3 方应用程序。我使用制造商提供的库中的几个接口。该库由许多 DLL 组成,我访问其中一个用于接口。
我发现当他们发布新版本的应用程序时,我遇到了一些问题。
安装代码将我在开发机器上引用的 DLL 复制到项目 bin 文件夹中。我通过在实现接口的具体实例之前临时添加 DLL 的路径而不是在构建过程中复制它来解决这个问题。
现在的问题是我无法创建他们的对象。错误是:
Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’.
我认为这是因为我的源代码引用了不同版本的 DLL。当程序运行时,它知道它与编译时所针对的不同。即使版本之间的签名相同并且 public 密钥令牌相同,也是如此。
我直观地比较了我在 VS 对象资源管理器中使用的接口的签名,它们是匹配的。
我尝试采用另一种方式,将较新的 DLL 复制到我机器上的一个文件夹中并引用该文件夹。编译后在我的电脑上出现转换错误,它在测试电脑上运行。
我认为这会起作用,否则绑定重定向如何起作用?
我考虑过手动加载程序集,但我该如何访问这些方法?查看查找方法似乎并不容易。我是否必须创建自己的接口和适配器以将它们映射到我的,以便我进行一次查找?
Can a .Net application compiled with an older assembly's Interface create objects with a newer version?
如果第三方公司把程序集拆分出来,一个装接口,一个装代码,一个就可以了。
但因为他们不这样做,所以接口被标记为特定版本,因此您会得到 names/namespace 相同的转换错误。
The install code copied the DLL I was referencing on my development machine to the projects bin folder.
安装到不同位置无济于事,加载也无济于事。您已经提到过创建一个本身就是一个项目的工作。
唯一的选择是要么将代码更新到新版本,要么根本不更新。
解决方案是在主应用程序的 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,所以我必须手动将其添加到安装程序的安装文件列表中。从长远来看,运行 这个模块是可选的,可能不需要这个依赖项,所以我不想将它添加到主项目的引用中。
我有一个与我的 C# 桌面代码一起使用的第 3 方应用程序。我使用制造商提供的库中的几个接口。该库由许多 DLL 组成,我访问其中一个用于接口。 我发现当他们发布新版本的应用程序时,我遇到了一些问题。
安装代码将我在开发机器上引用的 DLL 复制到项目 bin 文件夹中。我通过在实现接口的具体实例之前临时添加 DLL 的路径而不是在构建过程中复制它来解决这个问题。
现在的问题是我无法创建他们的对象。错误是:
Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’.
我认为这是因为我的源代码引用了不同版本的 DLL。当程序运行时,它知道它与编译时所针对的不同。即使版本之间的签名相同并且 public 密钥令牌相同,也是如此。
我直观地比较了我在 VS 对象资源管理器中使用的接口的签名,它们是匹配的。
我尝试采用另一种方式,将较新的 DLL 复制到我机器上的一个文件夹中并引用该文件夹。编译后在我的电脑上出现转换错误,它在测试电脑上运行。
我认为这会起作用,否则绑定重定向如何起作用?
我考虑过手动加载程序集,但我该如何访问这些方法?查看查找方法似乎并不容易。我是否必须创建自己的接口和适配器以将它们映射到我的,以便我进行一次查找?
Can a .Net application compiled with an older assembly's Interface create objects with a newer version?
如果第三方公司把程序集拆分出来,一个装接口,一个装代码,一个就可以了。
但因为他们不这样做,所以接口被标记为特定版本,因此您会得到 names/namespace 相同的转换错误。
The install code copied the DLL I was referencing on my development machine to the projects bin folder.
安装到不同位置无济于事,加载也无济于事。您已经提到过创建一个本身就是一个项目的工作。
唯一的选择是要么将代码更新到新版本,要么根本不更新。
解决方案是在主应用程序的 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,所以我必须手动将其添加到安装程序的安装文件列表中。从长远来看,运行 这个模块是可选的,可能不需要这个依赖项,所以我不想将它添加到主项目的引用中。