Выполнение динамического кода в WinRT в Windows 8 (либо С++, либо .NET/С#)?

Поддерживает ли WinRT под окнами 8 метро динамическая загрузка и выполнение кода? Например, можно ли загрузить dll в память или изолированное хранилище и запустить код из него? Может ли код, который JIT компилирует язык сценариев на собственный язык ассемблера (например, сторонние браузеры), может сделать то же самое в WinRT или запрещен как "небезопасная" операция?

Является ли ответ на этот вопрос другим для "управляемого" кода, запущенного в WinRT? Например, в управляемом коде вы могли бы загрузить сборку из Интернета и открыть ее в MEF или иначе загрузить ее во время выполнения? Можете ли вы использовать Reflection.Emit в той или иной форме? В С++ вы можете запускать код сборки, сгенерированный во время выполнения вашим приложением, или динамически загружать DLL во время выполнения (предположительно, в какой-то форме WinRT DLL)?

Ответ 1

Вы задаете вопрос немного неясно... так что некоторые общие указатели:

  • Приложение .NET, используя, среди прочего, WinRT (но не новую модель пользовательского интерфейса!)
    В этом случае все возможно, что вы сегодня (возможно, не OLEDB), а Reflection и т.д.

  • .NET-приложение построено для Metro UI
    AFAIK это невозможно (см. http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/metro-net-framework-profile-windows-tailored.aspx и http://tirania.org/blog/), по крайней мере, до тех пор, пока вы хотите продать через Windows Store... вне этой области (Windows Store) могут быть некоторые трюки, чтобы обойти это ограничение, как уже было показано некоторыми... но я не буду рассчитывать на это... MAYBE вы можете использовать некоторый JavaScript (eval и т.д.), Чтобы сделать что-то динамическое, но я не уверен в настоящее время

Ответ 2

В общем, вы не можете загружать и выполнять новый код в приложении Metro style. То, что вы можете получить, - это то, что вы отправляете с помощью приложения.

LoadLibrary и GetProcAddress отсутствуют, поэтому С++ не может динамически загружать код.
Аналогично, С# не может, потому что нет Assembly.Load.
JavaScript может, но только в веб-контейнере, а не в более полных частях доверия кода.

Причиной всего этого является то, что магазин безопасность/защита от вредоносных программ будет спорно, если приложение может просто загрузить и запустить произвольный код.

Ответ 3

На самом деле приложения Metro style CAN динамически загружают и выполняют код. Существуют некоторые ограничения; Приложения Metro и Desktop работают по-разному по-ключевому.

Механизмы немного различаются в зависимости от вызывающего (LoadPackagedLibrary() Assembly.Load() и т.д.). Одно из ключевых различий между приложениями Metro и Desktop - Metro может динамически загружать то, что на вашем графике пакета приложений (ваш пакет и с) и системный код (который может быть загружен статически статически).

См. мой пост для получения более подробной информации http://social.msdn.microsoft.com/Forums/en-US/wingameswithdirectx/thread/d1ebe727-2d10-430e-96af-46964dda8225

Ответ 4

Поддерживает ли WinRT под окнами 8 метро динамическая загрузка и выполнить код?

Нет.

Например, можно ли загрузить dll в память или изолированное хранилище и запустить код из него?

Нет.

Может ли код, который JIT компилирует язык сценариев на собственный язык ассемблера (например, сторонние браузеры), может сделать то же самое в WinRT или запрещен как "небезопасная" операция?

Это было бы запрещено.

Является ли ответ на этот вопрос другим для "управляемого" кода, запущенного в WinRT?

Нет.

Например, в управляемом коде вы можете загрузить сборку из Интернета и открыть ее в MEF или иначе загрузить ее во время выполнения?

Нет.

Можете ли вы использовать Reflection.Emit в той или иной форме?

Нет.

В С++ вы можете запускать код сборки, сгенерированный во время выполнения вашим приложением, или динамически загружать DLL во время выполнения (предположительно, в какой-то форме WinRT DLL)?

Нет.

Все, что вы описали, позволит обойти защиту безопасности WinRT.

Ответ 5

Чтобы сделать его более интересным, IE 10 действительно делает JIT на свой js-код, поэтому API явно там, чтобы его разрешить.

Ответ 6

Windows 10 добавляет возможность codeGeneration для этой цели. Это позволяет использовать функции VirtualAllocFromApp и VirtualProtectFromApp для использования в приложениях WinRT, поскольку VirtualAlloc и VirtualProtect будут использоваться в Win32.

Ответ 7

Вы можете создать компонент Runtime Windows (Universal Windows) С++, Вы получаете доступ к компоненту из кода С#, внутри компонента, который вы можете вызвать LoadPackagedLibrary, который имеет ограничение на то, что он может загружать только DLL, которые упакованы вместе с вашим приложением. В противном случае это то же самое, что и LoadLibrary.

Вы не можете загружать и динамически загружать, так как ApplicationData и InstalledLocation - это разные местоположения. (LoadPackagedLibrary не позволяет указать путь). И вы можете писать только в ApplicationData...

Ответ 8

Пример загрузки динамической сборки из каталога пакетов AppX (из Форумы MSDN):

private async Task<IEnumerable<Assembly>> GetAssemblyListAsync()
{
    var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;

    List<Assembly> assemblies = new List<Assembly>();
    foreach (StorageFile file in await folder.GetFilesAsync())
    {
        if (file.FileType == ".dll" || file.FileType == ".exe")
        {
            var name = file.Name.Substring(0, file.Name.Length - file.FileType.Length);
            Assembly assembly = Assembly.Load(new AssemblyName() { Name = name });
            assemblies.Add(assembly);
        }
    }

    return assemblies;
}

Агрегаты должны быть добавлены в пакет приложений. Вы не можете загрузить их из внешнего источника.

Однако этот подход не работает в .NET Native, потому что все объединено в одну DLL. Вы должны сохранить список имен сборки где-нибудь (в простом файле внутри Assets) и вызвать Assembly.Load для каждого элемента.

Пример списка динамических сборок в режиме отладки и предопределенного массива имен сборки в режиме выпуска (основная цепочка инструментов .NET).

#if DEBUG
using Windows.Storage;
#endif

    // ...

    IEnumerable<string> assemblyNames;

#if DEBUG
    assemblyNames = Windows.ApplicationModel.Package.Current.InstalledLocation.GetFilesAsync().AsTask().Result
        .Where(file => file.FileType == ".dll" && file.Name.Contains("Business"))
        .Select(file => file.Name.Substring(0, file.Name.Length - file.FileType.Length));
#else
    assemblyNames = new[] { "California.Business", "Colorado.Business" };
#endif

    foreach (var name in assemblyNames)
    {
        var assembly = Assembly.Load(new AssemblyName() { Name = name });

        // Load required types.
        // ...

    }

Ответ 9

Возможно его, проверьте приложение Google Chrome в Windows 8, они предоставляют возможность переключения между обычным режимом и режимом Windows 8, сохраняющим просматриваемые страницы.