动态代码执行(C++或.NET/C#)?Windows8Metro下的WinRT是否允许动态加载和执行代码?例如,是否可以将dll下载到内存或隔离存储并从中运行代码?编写JIT将脚本语言编译为本机汇编语言(例如第3方浏览器)的代码是否能够在WinRT中执行相同的操作,或者作为“不安全”操作被禁止?对于在WinRT中运行的“托管”代码,这个问题的答案是否不同?例如,在托管代码中,您能否从Internet下载程序集并使其在MEF中可被发现,或者能够在运行时加载它?你能使用某种形式的Reflection.Emit吗?在C++中,您可以运行应用程序在运行时生成的汇编代码,还是可以在运行时动态加载DLL(可能是某种形式的WinRTDLL)?你的问题有点不清楚......所以一些一般性的指示:通常,你不能在Metro风格应用程序中加载和执行新代码。您有权访问的是您随应用程序提供的内容。缺少LoadLibrary和GetProcAddress,因此C++无法动态加载代码。同样,C#也不能,因为没有Assembly.Load。JavaScript可以,但只能在Web容器中,而不是在代码中更完全受信任的部分。这一切的原因是,如果应用程序只能加载和运行任意代码,商店的安全/恶意软件保护就没有实际意义。事实上,Metro风格应用程序可以动态加载和执行代码。有一些限制;Metro和桌面应用程序的工作方式在关键方面略有不同。该机制因调用者而异(LoadPackagedLibrary()Assembly.Load()等)。Metro和桌面之间的一个主要区别-Metro应用程序只能在应用程序的包图(包和s)和系统代码(可以静态加载)中动态加载内容。有关更多详细信息,请参阅我的帖子http://social.msdn.microsoft.com/Forums/en-US/wingameswithdirectx/thread/d1ebe727-2d10-430e-96af-46964dda8225Windows8metro下的WinRT是否允许您动态加载和执行代码?不。例如,是否可以将dll下载到内存或隔离存储并从中运行代码?否。编写JIT将脚本语言编译为本机汇编语言(例如第3方浏览器)的代码是否能够在WinRT中执行相同的操作,或者作为“不安全”操作被禁止?这将被禁止。对于在WinRT中运行的“托管”代码,这个问题的答案是否不同?否。例如,在托管代码中,您能否从Internet下载程序集并使其在MEF中可被发现,或者能够在运行时加载它?不可以。您可以使用某种形式的Reflection.Emit吗?否。在C++中,您可以运行应用程序在运行时生成的汇编代码,还是可以在运行时动态加载DLL(可能是某种形式的WinRTDLL)?不。您描述的所有内容都避免了WinRT的安全保证。为了让它更有趣,IE10对其js代码进行了JIT,因此API显然允许这样做。Windows10为此添加了代码生成功能。这允许在WinRT应用程序中使用VirtualAllocFromApp和VirtualProtectFromApp函数,因为VirtualAlloc和VirtualProtect将在Win32中使用。您可以创建一个Windows运行时组件(通用Windows)C++,从可以调用LoadPackagedLibrary的组件内部的c#代码访问该组件,它的限制是它只能加载与应用程序一起打包的DLL。否则它与LoadLibrary相同。您不能动态下载和加载,因为ApplicationData和InstalledLocation是不同的位置。(LoadPackagedLibrary不允许您指定路径)。并且您只能写入ApplicationData...从AppX包目录(来自MSDN论坛)加载动态程序集的示例:列表程序集=newList();foreach(StorageFilefileinawaitfolder.GetFilesAsync()){if(file.FileType==".dll"||file.FileType==".exe"){varname=file.Name.Substring(0,file.名称.长度-文件.文件类型.长度);程序集assembly=Assembly.Load(newAssemblyName(){Name=name});程序集。添加(程序集);}}返回程序集;}程序集必须添加到应用程序包中。您不能从外部来源下载它们。但是,此方法在.NETNative中不起作用,因为所有内容都组合到一个DLL中。您应该在某处保留程序集名称列表(在资产中的一个简单文件中)并为每个项目调用Assembly.Load。调试模式下的动态程序集列表示例和发布模式下的一组预定义程序集名称(.NET本机工具链)。#ifDEBUG使用Windows.Storage;#endif//...IEnumerable程序集名称;#ifDEBUGassemblyNames=Windows.ApplicationModel.Package.Current.InstalledLocation.GetFilesAsync().AsTask().Result.Where(file=>file.FileType==".dll"&&file.Name.Contains("业务")).Select(file=>file.Name.Substring(0,file.Name.Length-file.FileType.Length));#elseassemblyNames=new[]{"California.Business","Colorado.Business"};#endifforeach(varnameinassemblyNames){varassembly=Assembly.Load(newAssemblyName(){Name=name});//加载所需的类型。//...}你可能会检查Windows8中的GoogleChrome应用程序,它们提供了一种在正常模式和Windows8模式之间切换以持续查看页面的方法。以上就是C#学习教程:Dynamiccodeexecution(C++or.NET/C#)onWinRTinWindows8?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
