.NET Native工具链如何详细处理托管的.winmd组件库?
我知道.NET Native将DLL中的所有托管代码合并为一个可执行文件,并在将其编译为本机代码时删除未使用的代码。
但是.winmd托管库使用了什么算法?例如,WinRT中的后台任务(例如音频后台任务)托管在winmd库中,然后这些任务托管在系统提供的本机进程中,该进程动态调用winmd提供的类。它如何与.NET Native概念兼容?
我担心.NET Native可能无法将托管的.winmd代码转换为本机,而环境将回退到.NET运行时以执行托管winmd中的代码,因此放弃了本机编译的可执行文件的好处。或者它是如何工作的?
请提供有关此信息不太明确的信息。在MSDN文档中,没有关于托管winmd组件库和.NET Native工具链的详细信息。
答案 0 :(得分:2)
我在.NET本地团队工作,我很乐意帮助澄清。
.NET native确实会将托管的WinMD程序集转换为本机代码,并将其与应用程序DLL(截至今天)合并在一起。为了让后台任务进程找到这些托管WinRT类的本机代码,我们还修复了应用程序清单,指向现在具有本机代码的应用程序DLL。任务后台进程将愉快地加载应用程序DLL,并使用WinRT激活协议/ ABI激活在应用程序DLL中托管的本机代码中实现的托管WinRT类型。不需要JITting。
正如您所怀疑的那样,找到从本机代码激活的WinRT类有一些有趣的挑战。今天,我们保守地将托管WinMD中的所有公共WinRT类视为.NET本机编译器中的编译根,以及可从它们访问的所有内容。尺寸有一些影响,但这是没有JIT可用的权衡。
谢谢, 张毅