複数のアセンブリバージョンを複数のAppDomainにロードします

ベルパトリシア

私の目標は、特定のアセンブリを使用する「コードの一部」を、そのアセンブリの複数のバージョンで実行することです。私がこれを行う方法は、アセンブリバージョンごとに1つずつ、別々のAppDomainでその「コードの一部」を実行することです。

これは、「コードの一部」がリフレクションを介してアセンブリを使用する場合にのみ実行できましたが、その「コードの一部」を強く型付けされた方法で記述してもらいたいと思います。

つまり、次のアセンブリがあるとします。

namespace ClassLibrary1
{
    public class Class1
    {
        internal const string Version = "1.0.0.0";
        public string Method1() { return Version; }
    }
}

また、AssemblyInfo.csには次の定義があります。

[assembly: AssemblyVersion(ClassLibrary1.Class1.Version)]

ここで、「Versions」フォルダがあり、その中にそのアセンブリの複数のバージョンがあるとします。次に例を示します。

/Versions/
├─ /1000/
│   └─ ClassLibrary1.dll
├─ /1001/
│   └─ ClassLibrary1.dll
└─ /1002/
    └─ ClassLibrary1.dll  

ここで「コードの一部」を実行するために、次のコンソールアプリケーションを使用しています。

class Program
{
    static void PieceOfCode(Assembly assembly)
    {
        Type class1Type = assembly.GetType("ClassLibrary1.Class1");
        dynamic class1 = Activator.CreateInstance(class1Type);
        string vesion = class1.Method1();

        Console.WriteLine(vesion);
    }

    public sealed class SeparateDomainExecutor : MarshalByRefObject
    {
        public void Execute(Action<Assembly> action, string assemblyPath)
        {
            action(Assembly.LoadFrom(assemblyPath));
        }
    }

    static void Main(string[] args)
    {
        foreach (string file in Directory.EnumerateFiles(@"C:\Versions", "*.dll", SearchOption.AllDirectories))
        {
            AppDomain domain = AppDomain.CreateDomain("ClassLibrary1 Domain");

            var type = typeof(SeparateDomainExecutor);
            var runner = (SeparateDomainExecutor)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
            runner.Execute(PieceOfCode, file);

            AppDomain.Unload(domain);
        }

        Console.Read();
    }
}

コンソールアプリケーションは正常に動作しますが、「PieceOfCode」でのリフレクションの使用法を次のようなものに置き換えたいと思います。

static void PieceOfCode()
{
    ClassLibrary1.Class1 class1 = new ClassLibrary1.Class1();
    Console.WriteLine(class1.Method1());
}

これは可能ですか?

私がこれに関して抱えている問題は、PieceOfCodeがClassLibrary1の特定のバージョン(おそらく最新)を使用して記述され、別のAppDomainでそのバージョンを「オーバーライド」する方法がわからないことです。いくつか試しましたが、常にFileLoadExceptionが発生します。

ウィギー

残念ながらClassLibrary1.Class1、静的に型指定されたコードを記述する場合、アセンブリ参照が必要であり、コンパイラーはその参照を使用して、クラスの特定のバージョンに名前を付けます。完全修飾名(typeof(Class1).AssemblyQualifiedName)にはアセンブリのパスやファイル名は含まれず、アセンブリ名とバージョンのみが含まれますが、クラスローダーにはさらに制限があります。

  • 同じ名前の異なるアセンブリから同じ名前空間に2つのクラスをロードすることはできません
  • パスまたはファイル名はアセンブリ参照の一部ではないため、同じ厳密な名前で2つのアセンブリをコンパイル時に参照することはできません。

使用方法Assembly.LoadFrom(...)と動的バインディングは、私が思いついた最高のものです。そしてこれは、Officeアセンブリのさまざまなバージョンが、それらを統合するアプリケーションから通常どのように扱われるかです。

私が見る唯一の可能な解決策は、コードの一部を別々のアセンブリ(たとえば、MyStaticIntegration.dll)に分割し、依存関係の各バージョン(ClassLibrary1.dll)に対して個別にコンパイルしてから、MyStaticIntegration.dllの各バージョンをアプリケーションに統合することです。以前にClassLibrary1.dllで行ったのと同じ方法です。

同じ動的な壁がアプリケーションに残りますが、このトリックを使用して動的に使用しているインターフェイスを絞り込むことができます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

異なるバージョンのアセンブリを別のAppDomainにロードします

分類Dev

別のWPFアプリからWPFアプリケーションアセンブリをロードすると、エラーが発生します:同じAppDomainに複数のSystem.Windows.Applicationインスタンスを作成できません

分類Dev

複数のプロジェクト、単一のアセンブリバージョンマネージャー

分類Dev

同じデバイスに同じソリューションの複数のアプリバージョンをサイドローディングする

分類Dev

CUPSは複数のジョブをIPPプリンターに送信します

分類Dev

アセンブリの複数のバージョンを追跡する方法は?

分類Dev

AWS Lambdaを複数のリージョンにデプロイしますか?

分類Dev

AWS Lambdaを複数のリージョンにデプロイしますか?

分類Dev

Webアプリケーションで複数のXSDをどのようにロードしますか?

分類Dev

SSISは、comアプリケーションプロセスタスク引数に複数のコマンドラインを追加します

分類Dev

npmは複数のバージョンでパッケージをダウンロードします

分類Dev

HBaseセルに複数のバージョンを保存する

分類Dev

同じソリューションで複数のバージョンのServiceStackアセンブリを使用する場合のランタイムエラー

分類Dev

FlashAS3-複数のオブジェクトを複数のターゲットにドラッグアンドドロップします

分類Dev

AmazonLinux上の複数のPHP-FPMバージョンが同じ設定をロードします

分類Dev

チャネルを使用するためだけに調整されたPhoenixアプリケーションは、複数のマシンでどのように拡張できますか?HAProxyを使用していますか?すべてのノードにメッセージをブロードキャストする方法は?

分類Dev

openshiftに複数のバージョンをデプロイできますか?

分類Dev

単一のハイブアプリケーション(ジョブ)は複数のヤーンアプリケーションを生成しますか?

分類Dev

Swagger UIは、単一のアクションパラメータにバインドされた複数のヘッダーを、複数のヘッダーとしてではなく、単一のjsonオブジェクトとして送信します。

分類Dev

同じアプリケーションの複数のバージョンで同じバージョンのアセンブリを使用するにはどうすればよいですか? c#

分類Dev

Raspbianで、複数のPythonバージョンを同時に実行します

分類Dev

applicationBase C#の外部のAppDomainにアセンブリをロードする

分類Dev

複数のラジオボタンを個々のブール値にバインドします

分類Dev

MVVMはIsEnabledをViewModelの複数のブールにバインドします

分類Dev

ハイブリッドアプリケーションのデバイスのギャラリーから複数の画像を選択します

分類Dev

Chromeの複数のバージョンをインストールします

分類Dev

複数のモジュールと複数のアセンブリを備えたMavenプロジェクト

分類Dev

1つのOracleAPEXアプリケーションを複数のスキーマにデプロイします

分類Dev

リソースを複数のApacheサーバーにダウンロードしますか?[Linux OS]

Related 関連記事

  1. 1

    異なるバージョンのアセンブリを別のAppDomainにロードします

  2. 2

    別のWPFアプリからWPFアプリケーションアセンブリをロードすると、エラーが発生します:同じAppDomainに複数のSystem.Windows.Applicationインスタンスを作成できません

  3. 3

    複数のプロジェクト、単一のアセンブリバージョンマネージャー

  4. 4

    同じデバイスに同じソリューションの複数のアプリバージョンをサイドローディングする

  5. 5

    CUPSは複数のジョブをIPPプリンターに送信します

  6. 6

    アセンブリの複数のバージョンを追跡する方法は?

  7. 7

    AWS Lambdaを複数のリージョンにデプロイしますか?

  8. 8

    AWS Lambdaを複数のリージョンにデプロイしますか?

  9. 9

    Webアプリケーションで複数のXSDをどのようにロードしますか?

  10. 10

    SSISは、comアプリケーションプロセスタスク引数に複数のコマンドラインを追加します

  11. 11

    npmは複数のバージョンでパッケージをダウンロードします

  12. 12

    HBaseセルに複数のバージョンを保存する

  13. 13

    同じソリューションで複数のバージョンのServiceStackアセンブリを使用する場合のランタイムエラー

  14. 14

    FlashAS3-複数のオブジェクトを複数のターゲットにドラッグアンドドロップします

  15. 15

    AmazonLinux上の複数のPHP-FPMバージョンが同じ設定をロードします

  16. 16

    チャネルを使用するためだけに調整されたPhoenixアプリケーションは、複数のマシンでどのように拡張できますか?HAProxyを使用していますか?すべてのノードにメッセージをブロードキャストする方法は?

  17. 17

    openshiftに複数のバージョンをデプロイできますか?

  18. 18

    単一のハイブアプリケーション(ジョブ)は複数のヤーンアプリケーションを生成しますか?

  19. 19

    Swagger UIは、単一のアクションパラメータにバインドされた複数のヘッダーを、複数のヘッダーとしてではなく、単一のjsonオブジェクトとして送信します。

  20. 20

    同じアプリケーションの複数のバージョンで同じバージョンのアセンブリを使用するにはどうすればよいですか? c#

  21. 21

    Raspbianで、複数のPythonバージョンを同時に実行します

  22. 22

    applicationBase C#の外部のAppDomainにアセンブリをロードする

  23. 23

    複数のラジオボタンを個々のブール値にバインドします

  24. 24

    MVVMはIsEnabledをViewModelの複数のブールにバインドします

  25. 25

    ハイブリッドアプリケーションのデバイスのギャラリーから複数の画像を選択します

  26. 26

    Chromeの複数のバージョンをインストールします

  27. 27

    複数のモジュールと複数のアセンブリを備えたMavenプロジェクト

  28. 28

    1つのOracleAPEXアプリケーションを複数のスキーマにデプロイします

  29. 29

    リソースを複数のApacheサーバーにダウンロードしますか?[Linux OS]

ホットタグ

アーカイブ