11

Windows 8 MetroのWinRTでは、コードを動的に読み込んで実行できますか?たとえば、dllをメモリにダウンロードしたり、分離されたストレージにダウンロードして、そこからコードを実行したりすることは可能ですか?JITがスクリプト言語をネイティブアセンブリ言語(サードパーティのブラウザなど)にコンパイルするコードは、WinRTでも同じことができますか、それとも「安全でない」操作として禁止されていますか?

この質問に対する答えは、WinRTで実行されている「マネージ」コードとは異なりますか?たとえば、マネージコードで、インターネットからアセンブリをダウンロードして、MEFで検出できるようにするか、実行時にロードできるようにすることができますか?Reflection.Emitを何らかの形で使用できますか?C ++では、アプリケーションによって実行時に生成されたアセンブリコードを実行できますか、それとも実行時にDLL(おそらく何らかの形式のWinRT DLL)を動的にロードできますか?

4

9 に答える 9

11

通常、Metroスタイルアプリでは新しいコードを読み込んで実行することはできません。アクセスできるのは、アプリに同梱されているものです。

LoadLibraryとGetProcAddressがないため、C++はコードを動的にロードできません。
同様に、Assembly.Loadがないため、C#ではできません。
JavaScriptは可能ですが、コードの完全な信頼部分ではなく、Webコンテナーでのみ可能です。

このすべての理由は、アプリが任意のコードをロードして実行できる場合、ストアのセキュリティ/マルウェア保護は無効になるためです。

于 2011-09-20T03:48:11.093 に答える
8

実際、Metroスタイルアプリはコードを動的に読み込んで実行できますいくつかの制限があります。Metroアプリとデスクトップアプリは、重要な点で少し異なります。

メカニズムは、呼び出し元(LoadPackagedLibrary()Assembly.Load()など)によって少し異なります。Metroとデスクトップの主な違いの1つ-Metroアプリは、アプリのパッケージグラフ(パッケージとs)とシステムコード(静的にロードされる可能性があります)にあるもののみを動的にロードできます。

詳細については、私の投稿を参照して くださいhttp://social.msdn.microsoft.com/Forums/en-US/wingameswithdirectx/thread/d1ebe727-2d10-430e-96af-46964dda8225

于 2011-12-28T20:51:56.670 に答える
7

Windows 8 MetroのWinRTでは、コードを動的に読み込んで実行できますか?

いいえ。

たとえば、dllをメモリにダウンロードしたり、分離されたストレージにダウンロードして、そこからコードを実行したりすることは可能ですか?

いいえ。

JITがスクリプト言語をネイティブアセンブリ言語(サードパーティのブラウザなど)にコンパイルするコードは、WinRTでも同じことができますか、それとも「安全でない」操作として禁止されていますか?

禁止されます。

この質問に対する答えは、WinRTで実行されている「マネージ」コードとは異なりますか?

いいえ。

たとえば、マネージコードで、インターネットからアセンブリをダウンロードして、MEFで検出できるようにするか、実行時にロードできるようにすることができますか?

いいえ。

Reflection.Emitを何らかの形で使用できますか?

いいえ。

C ++では、アプリケーションによって実行時に生成されたアセンブリコードを実行できますか、それとも実行時にDLL(おそらく何らかの形式のWinRT DLL)を動的にロードできますか?

いいえ。

あなたが説明したすべては、WinRTの安全保証を回避することを可能にします。

于 2011-10-07T16:39:54.700 に答える
2

あなたの質問は少し不明確です...だからいくつかの一般的なポインタ:

  • とりわけWinRTを使用する.NETアプリ(ただし、新しいUIモデルではありません!)
    この場合、今日(おそらくOLEDBではない)すべてが可能ですが、Reflectionなどです。

  • Metro UI
    AFAIK用に構築された.NETアプリは不可能です(http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/metro-net-framework-profile-windows-tailoredを参照してください)。 aspxhttp://tirania.org/blog/)少なくともWindowsストア経由で販売したい限り...この範囲(Windowsストア)の外では、すでにいくつかによって示されているように、その制限を回避するためのいくつかのトリックがあるかもしれません。 ..しかし、私はそれを当てにしません...多分あなたはeval動的な何かをするためにいくつかのJavaScript(など)を使うことができますが、私は現在わかりません

于 2011-09-19T16:04:39.660 に答える
2

Windows 10は、この目的のためにcodeGeneration機能を追加します。これにより、関数VirtualAllocFromAppおよびVirtualProtectFromAppをWinRTアプリで使用できるようになります。これは、VirtualAllocおよびVirtualProtectがWin32で使用されるためです。

于 2015-09-30T05:48:35.890 に答える
1

さらに面白くするために、IE 10は実際にはそのjsコードでJITを実行するため、APIは明らかにそれを可能にします。

于 2011-10-10T12:59:38.807 に答える
0

Windowsランタイムコンポーネント(ユニバーサルWindows)C ++を作成できます。c#コードからコンポーネントにアクセスします。コンポーネント内でLoadPackagedLibraryを呼び出すことができます。これには、アプリにパッケージ化されているDLLのみをロードできるという制限があります。それ以外はLoadLibraryと同じです。

ApplicationDataとInstalledLocationは別の場所であるため、ダウンロードして動的にロードすることはできません。(LoadPackagedLibraryではパスを指定できません)。そして、あなたはApplicationDataにしか書くことができません...

于 2015-11-16T06:48:18.720 に答える
0

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;
}

アセンブリをアプリケーションパッケージに追加する必要があります。外部ソースからダウンロードすることはできません。

ただし、すべてが単一のDLLにマージされるため、このアプローチは.NETネイティブでは機能しません。アセンブリ名のリストをどこかに(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.
        // ...

    }
于 2015-12-27T07:56:58.390 に答える
-1

可能です。Windows8のGoogleChromeアプリを確認してください。通常モードと、表示されているページを保持するWindows8モードを切り替える方法を提供しています。

于 2013-01-18T12:31:17.057 に答える