1

はい、警告ラベルを読みました。動的にアセンブリをロードすることはお勧めできません。そうは言っても、私はアセンブリをロードするアプリケーションを持っています - それがまさにそれがどのように機能するかです。Windowsでは問題なく動作します。Windows CE で正常に動作します。多少のマッサージが必要な場合でも、Androidで「正常に動作する」必要があります。

基本的に、アプリは、実行時に特定のインターフェイスを満たすプラグイン DLL (アダプターと呼びます) をロードするエンジンです。Windows では、任意の時点で DLL の出現を検出し、実行してロードします。Android で動作しなくても問題ありません。

私が問題を抱えているのは、エンジンが設計/コンパイル時に知っていたアダプターをエンジンにロードさせることですが、そのアダプターの名前をエンジンコードにハードコーディングすることはありません。リンクアウトされないようにするためにアダプターへの参照を追加しても問題ありませんが、DLL は展開によって異なるため、毎回 DLL 名を追加する必要はありません。大きな頭痛につながります。

したがって、参照されている場合は APK に入り、リフレクションを使用して次のようにロードできると考えました。

var asm = Assembly.Load("TheAdapterName.dll");

最初のテストでは、名前をハードコーディングするだけでこれがアダプターで機能することが示されていますが、繰り返しますが、それは避けたいと思っています。

それで、参考文献を調べて名前を抽出できるのではないかと思ったのですが、奇妙なことに、そうするとすべての参考文献が実際に表示されるわけではありません。だから私はこれを行います:

var refs = asm.GetReferencedAssemblies().Select(a => a.Name).ToArray();

そして、14 個のアセンブリ名の配列が返されます。しかし、アセンブリ (asm) には16の参照があり、そのうちの 1 つは、ロードする必要があるアダプター プラグインです。アダプターは間違いなくそこにあります-2Assembly.Load行上のフルネームで使用したところ、解決しました。

たぶん、実行しているフォルダーへの「パス」を見つけて、そこでDLLを探して、そのようにロードできるのではないかと思いました。ハ。デバッグとリリースで機能するパスを取得する方法を見つけようと数時間試みた後、思いついたのは白髪だけでした。

すっごく...... APKにあることがわかっているDLLの名前を取得する方法についての考えはありますが、ビルド時に名前を「知らない」(私はそれらをロードして探しています) 「適応性」を検出するためのリフレクションを介したインターフェイスの場合)。

4

1 に答える 1

0

これらの方法が機能しない場合、私が考えることができる唯一の提案は、必要なリストを提供するために、C#またはアセットファイルのいずれかを更新するビルド前のステップを追加することです。

明らかにこれは余分な作業ですが、完全に自動化する必要があり、プラットフォームの変更がどのように行われたとしても機能することが保証されています。


余談ですが、リフレクターを使用してmvxプロジェクトの1つを調べました。これは、asm.GetReferencedAssemblies()調査レポートと同じリストを示しています。ランタイムにロードされたプラグインはリストされていません。このメソッドは、ILレベルで型参照をインポートするために実際に使用されるアセンブリについてのみレポートしていると思いGetReferencedAssembliesます-したがって、csprojでアセンブリを参照しているが、型をインポートしない場合、コンパイルされたコードでそれらを参照としてリストしません。

于 2013-02-20T08:18:26.913 に答える