1

Assembly.Loadアセットフォルダにあるときにdllをロードすることは可能ですか?

WindowsとAndroid用のプラットフォーム固有のdllがあります。Android固有のdllをアセットとして使用しようとしましたが(ビルドアクションでも)、アプリにロードしようとしても見つかりません(使用しましたpath: file:///android_asset/mydll.dll)。これは、アプリをリリースとしてビルドした場合にのみ発生します。デバッグでは、ライブラリをロードするために必要なパスを取得しますが、アセットフォルダーからは取得しません。

私に何ができる?アプリからロードするdllを配置できる別の場所はありますか?

4

2 に答える 2

4

これは、アセンブリをPluginsフォルダーに書き出し、それらを読み込んで実行時にロードする例です。

AndroidAssetのビルドアクションに設定されたAssetsフォルダーに移動するアセンブリがあることを確認してください。以下のスクリーンショットを参照してください。

注意:拡張子を.mp3に変更する必要がある場合があります。ここを参照してください。私はこの問題を抱えていませんでした。

ここに画像の説明を入力してください

これを行うと、アセットマネージャーを使用してアセットを取得できるようになります。それらをロードするか、それらを使って何でもすることができます。これは、それらをメモリに読み込んで名前を書き出すサンプルです。

const String pluginPath = "Plugins";

var pluginAssets = Assets.List(pluginPath);
foreach (var pluginAsset in pluginAssets)
{
    var file = Assets.Open(pluginPath + Java.IO.File.Separator + pluginAsset);

    using (var memStream = new MemoryStream())
    {
        file.CopyTo(memStream);

        //do something fun.
        var assembly = System.Reflection.Assembly.Load(memStream.ToArray());
        Console.WriteLine(String.Format("Loaded: {0}", assembly.FullName));
    }

}

リリースモードでは、Mono for Androidがライブラリの静的分析を実行して、サイズの最適化を実行することに注意してください。この後にアセンブリをロードする場合は、含まれているはずの機能がない可能性があります。以下のスクリーンショットは、リリースビルドの標準のリンク構成を示しています。リンクを防ぐためにコードに追加できるフラグと構成がいくつかありますが(Xamarin Docs on Linking)、動的にロードされたライブラリに対して実行できることが多すぎるかどうかはわかりません。

Android用Mono-リリースリンク

于 2013-01-24T13:56:41.063 に答える
0

これはあなたの質問に対する直接的な回答ではありません。アセットからアセンブリをロードすることについてはわかりません。

ただし、mvvmcross でプラグインをロードした経験はかなりあります。


mvx では、UI プロジェクトへの参照として dll を追加し、Assembly.Load実行時に呼び出すだけで、droid にプラットフォーム固有のプラグインをロードします。これはうまくいくようです。

さらに、同じアプローチをフル Windows アプリケーション (Wpf など) でも使用できます。

ただし、同じアプローチを MonoTouch、Wp、または WinRt で使用することはできません。JIT およびセキュリティ/サンドボックスの制限により、assembly.load を使用する代わりに、UI プラットフォーム コードを使用して実際にコード参照を挿入する必要があります。詳細については、http://slodge.blogspot.co.uk/2012/10/build-new-plugin-for-mvvmcrosss.html? m=1 を参照してください。

于 2013-01-26T11:29:25.350 に答える