リフレクションを使用した外部アセンブリのロード

アレクサンドル・レイテス

外部モジュールの動的ロードをサポートするアプリケーションを開発しようとしています。C#(。NET v4.5)を使用して外部アセンブリをロードすることからいくつかの記事を読み、以下のコードを取得しました。ただし、それは機能しておらず、外部モジュールでサブクラスを検出していません。

外部アセンブリをロードするためのコードは次のとおりです。

byte[] array = <HERE I LOAD THE DLL>
Assembly asb = Assembly.Load(array);
Type[] types = GetAssemblyTypes(asb);
for( int i = 0; i < types.Length; i++ )
{
    Type t = types[i];
    if( t != null && typeof(App).IsAssignableFrom(t) /*t.IsSubclassOf(typeof(App))*/ )
    {
        app.AppClass = (App)Activator.CreateInstance(t);
        return true;
    }
}

これがGetAssemblyTypes()です

private Type[] GetAssemblyTypes(Assembly asb)
{
    Type[] types;
    try
    {
        types = asb.GetTypes();
    }
    catch( ReflectionTypeLoadException ex )
    {
        types = ex.Types;
    }

    return types;
}

これがメインアプリケーションのクラスです(このクラスはモジュールによって使用されます)

namespace MyApplication.API
{
    public class App
    {
       // CODE
    }
}

これが私のモジュールの例です:using MyApplication.API;

namespace HelloWorld
{
    class HelloWorld : App
    {

    }
}

重要なポイントは次のとおりです。1-モジュールのクラス名がわかりません。Appクラスのサブクラスになることはわかっています。

問題は、types.Lengthは1を与えますが、types [i]でアクセスしようとすると、nullポインターを与えることです。ここで何かが足りませんか?

アレクサンドル・レイテス

@CadBurryコードに基づいた半動作バージョンを入手しました。

byte[] bytes = <HERE I LOAD THE DLL>
Assembly asb = Assembly.Load(bytes);

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve;
IEnumerable<Type> types = asb.GetExportedTypes().Where(w => w.IsSubclassOf(typeof(App)));
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve;
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;

if(types.Count() > 0)
{
    Type type = types.FirstOrDefault();

    if( type == null )
        return false;

    app.AppClass = (App)Activator.CreateInstance(type);
    return true;
}

メソッドを使用して:

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if( args.Name.Contains(typeof(MyApplication).Assembly.GetName().Name) )
    {
        return Assembly.GetExecutingAssembly();
    }
    return null;
}

private Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    Assembly asb = AppDomain.CurrentDomain.GetAssemblies().Where(w => w.FullName == args.Name).FirstOrDefault();
    return asb;
}

上記のコードを使用すると、メインアプリケーションの現在のディレクトリ(プラグインフォルダなど)にない場合でも、アセンブリを読み込むことができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

.net Coreを使用してアプリケーションによってロードされたアセンブリで、リフレクションを使用してすべての特定のタイプを検索します

分類Dev

Assembly.LoadFromを使用してロードされたアセンブリでリフレクションが機能しない

分類Dev

外部アセンブリ リフレクションへのアクセス

分類Dev

リフレクションを使用して、別のアセンブリのページに移動します

分類Dev

ファブリックを使用したアクティブなTwitterセッションのログアウト

分類Dev

.NET4アプリケーションへの.NET4.5.2アセンブリのロード、リフレクションとリファレンス

分類Dev

アソシエーションを使用したアクティブレコードクエリのLIKE演算子

分類Dev

Java-リフレクションを使用した非静的プロパティへのアクセス

分類Dev

アノテーション+マクロまたは外部スクリプトを使用したScalaコード生成?

分類Dev

アノテーション+マクロまたは外部スクリプトを使用したScalaコード生成?

分類Dev

リフレクションを使用してオブジェクトのフィールドの値にアクセスする方法

分類Dev

クローズドリーダーアプリケーションを使用したNFCカードのエミュレーション

分類Dev

(C#.Net Core)リフレクションを使用して外部アセンブリからクラスをインスタンス化する

分類Dev

外部DBを使用したASP.netWebフォームアプリケーションのログイン

分類Dev

リフレクションを使用してユーザーフォルダからアセンブリを読み込めませんでした

分類Dev

ライブラリのコレクションビューセルに外部からUILabelを追加したい

分類Dev

リフレクションを使用した引数のデコード

分類Dev

リフレクションを使用したストリームでの不正なリフレクトアクセス

分類Dev

C#ストロングネームアセンブリリフレクションロードインターフェイスキャストの問題

分類Dev

COM相互運用機能を使用したリフレクションでの.NETアセンブリの不一致の解決

分類Dev

リフレクションを使用したモデルクラスの静的変数へのアクセス

分類Dev

アトミック置換を使用したスレッドセーフなシリアル化可能なコレクション

分類Dev

リフレクションを使用したAndroid4.4でのファイルアップロードの回避策

分類Dev

レガシーアセンブリは「プリンシパルパーミッションの要求に失敗しました」をスローします

分類Dev

フィードバックのリクエスト:複数のユーザー/アカウントのクライアントレプリケーション(pouchdb)を使用したCouchdbのセットアップ

分類Dev

GitHubアクション(およびGitHubパッケージレジストリ)を使用したビルドおよび公開プロセスの自動化

分類Dev

Webアプリケーションでのファイルまたはアセンブリのロード中にエラーが発生しました

分類Dev

辞書へのリフレクションによってアクセサFuncをロード

分類Dev

グラフェンリレーを使用したサブスクリプションの作成

Related 関連記事

  1. 1

    .net Coreを使用してアプリケーションによってロードされたアセンブリで、リフレクションを使用してすべての特定のタイプを検索します

  2. 2

    Assembly.LoadFromを使用してロードされたアセンブリでリフレクションが機能しない

  3. 3

    外部アセンブリ リフレクションへのアクセス

  4. 4

    リフレクションを使用して、別のアセンブリのページに移動します

  5. 5

    ファブリックを使用したアクティブなTwitterセッションのログアウト

  6. 6

    .NET4アプリケーションへの.NET4.5.2アセンブリのロード、リフレクションとリファレンス

  7. 7

    アソシエーションを使用したアクティブレコードクエリのLIKE演算子

  8. 8

    Java-リフレクションを使用した非静的プロパティへのアクセス

  9. 9

    アノテーション+マクロまたは外部スクリプトを使用したScalaコード生成?

  10. 10

    アノテーション+マクロまたは外部スクリプトを使用したScalaコード生成?

  11. 11

    リフレクションを使用してオブジェクトのフィールドの値にアクセスする方法

  12. 12

    クローズドリーダーアプリケーションを使用したNFCカードのエミュレーション

  13. 13

    (C#.Net Core)リフレクションを使用して外部アセンブリからクラスをインスタンス化する

  14. 14

    外部DBを使用したASP.netWebフォームアプリケーションのログイン

  15. 15

    リフレクションを使用してユーザーフォルダからアセンブリを読み込めませんでした

  16. 16

    ライブラリのコレクションビューセルに外部からUILabelを追加したい

  17. 17

    リフレクションを使用した引数のデコード

  18. 18

    リフレクションを使用したストリームでの不正なリフレクトアクセス

  19. 19

    C#ストロングネームアセンブリリフレクションロードインターフェイスキャストの問題

  20. 20

    COM相互運用機能を使用したリフレクションでの.NETアセンブリの不一致の解決

  21. 21

    リフレクションを使用したモデルクラスの静的変数へのアクセス

  22. 22

    アトミック置換を使用したスレッドセーフなシリアル化可能なコレクション

  23. 23

    リフレクションを使用したAndroid4.4でのファイルアップロードの回避策

  24. 24

    レガシーアセンブリは「プリンシパルパーミッションの要求に失敗しました」をスローします

  25. 25

    フィードバックのリクエスト:複数のユーザー/アカウントのクライアントレプリケーション(pouchdb)を使用したCouchdbのセットアップ

  26. 26

    GitHubアクション(およびGitHubパッケージレジストリ)を使用したビルドおよび公開プロセスの自動化

  27. 27

    Webアプリケーションでのファイルまたはアセンブリのロード中にエラーが発生しました

  28. 28

    辞書へのリフレクションによってアクセサFuncをロード

  29. 29

    グラフェンリレーを使用したサブスクリプションの作成

ホットタグ

アーカイブ