【问题标题】:Could not load type when changing the interface更改界面时无法加载类型
【发布时间】:2017-02-19 14:37:08
【问题描述】:
我正在开发具有抽象类示例的 SDK。
在新的 SDK 版本中,我拆分了抽象类,因此部分参数将位于 Example_BaseClass 上。所以“Example”继承自“Example_BaseClass”。
使用 Example 类的程序员不应受到此更改的影响。
如果我用新的 SDK 编译我的代码(我系统上的一种插件)并将其放在旧的软件版本(使用旧的 SDK)上,它会引发异常:
'无法从程序集中加载类型'Example_BaseClass''
它喜欢搜索新类,尽管它应该是透明的。
是否有可能保持这种向后兼容性?
谢谢
【问题讨论】:
标签:
c#
sdk
backwards-compatibility
【解决方案1】:
在您的新 SDK 中,Example 类依赖于 Example_BaseClass。因此,当您使用新 SDK 编译插件时,编译后的代码如下所示:
- 主要代码依赖于
Example(访问某些方法或继承自它)
-
Example 取决于 Example_BaseClass。它试图找到它并失败并出现运行时异常。
至于如何保持向后兼容性。 C# 编译为中间层而不是二进制代码(程序集)。这让 C# 有一定的好处,比如反射。但这是有代价的(如您所见)。除非CoreRT repo 的人给我们一种将代码本地编译成二进制文件的方法,否则我看到的唯一方法是将 SDK 发布为 nuget 包,经常更新它,并让人们经常dotnet restore 它。