.net framework 4.6.1
元素从.net framework 4.6.1
移植到.net core 2.0
/.net standard 2.0
?一些有用的类:希望为以下类创建shim:
System.Windows.Threading.Dispatcher
或
System.ComponentModel.ItemPropertyInfo.Descriptor
甚至
System.Windows.Controls.MenuItem
等等...
背景:
应用程序(代码)组织不是100%良好。业务逻辑与UI逻辑并没有完全分离。答案“先重构”绝对是一个好答案。但在我的情况下,事情并不完全如理想情况下所应该的。
手动尝试的近似示例:
Core 2.0
中未实现System.Windows.Threading.Dispatcher
。可以尝试添加:
public enum DispatcherShimPriority
{
Background
//...
}
public interface DispaicherShim
{
void Invoke(Action action, DispatcherShimPriority prio);
void BeginInvoke(Action action, DispatcherShimPriority, prio);
}
接着是这个接口的两个实现:
public class DispatcherCore: DispaicherShim;
and
public class DispatcherFramework: DispaicherShim;
在一个多目标项目中,接下来是一个类(我们称之为Shims
):
public static DispaicherShim CreateDispatcher()
{
#if NETCOREAPP2_0
return new DispatcherCore();
#else
return new DispatcherFramework();
#endif
}
这个方法是否正确?
实际上,创建这样的shim需要很多例行工作。我有一种感觉,认为这项工作不需要执行。我有一种感觉,这个问题已经有一个现成的解决方案...
我知道Microsoft.Windows.Compatibility
包。问题与在涉及许多WPF特定元素的情况下进行移植有关。这些元素不在Microsoft.Windows.Compatibility
包中,但遗憾的是,它们被用于我要重新定位到.Net Core 2.0
的程序集中。我的意思是shimming那些不在Microsoft.Windows.Compatibility
中的类。
好的,我们有了Microsoft.Windows.Compatibility.Shims
,但我不确定它在我的情况下是否有用;尤其是在阅读以下文本之后:
Microsoft.Windows.Compatibility.Shims:此软件包提供基础结构服务,不应从您的代码直接引用....
更新:强调最终目标是.net core 2.0
更新2:整个任务是将WPF应用程序的主要部分移植到.net core
(保留工作中的WPF应用程序),以供潜在的web-client使用。这个主要部分包含.net framework
元素,这些元素没有为.net core
实现。
更新3:关于完整策略的几句话:更完整的策略是共享项目,在此文章中的第一种方法(#if)。我的策略有两个主要步骤:一个是逐渐移植代码,从基本库开始,最后完成顶级库,并强调存根和PlatformNotSupportedException
s的密集使用。第二步是从顶级库移动到基本库,通过.net core实现替换存根和异常,按需执行(!)-不需要替换所有存根和异常。
更新4:我们已经将可移植测试与非可移植测试(分成两个库)分开了。在移植过程中运行测试非常重要。
PlatformNotSupportedException
。第二步是从顶层库移动到基础库,通过.NET Core实现替换存根和异常,按需(!)-无需替换所有存根和异常。 - Andrey K.