より多くのdllをコードにロードするとクラッシュが発生します

アンドリュー

私が開発を支援しているシステムの要件の1つは、ファイルをインポートする機能であり、遭遇すると予想されるさまざまなタイプのファイル(csv、xmlなど)を処理するためのアダプターのセットがあります。開発の初期段階では、参照を介してコマンドを使用してデータアダプタをハードコーディングしていました。明らかに、これが稼働するときは、新しいアダプターを作成し、dllをフォルダーにスローして、コードを再コンパイルせずにプロシージャを実行できる状況が必要になります。

これを実装するために、私はこの質問のコードを適応させました問題のコードは、次のようにコンストラクターにあります。

string dllLocation = @"C:MyLocation\dllLocation";
DirectoryInfo dir = new DirectoryInfo(dllLocation);
var tempfiles = dir.GetFiles("*Adapter*.dll", SearchOption.AllDirectories);     // This will need to be changed when we go live

    foreach (var file in tempfiles)
    {
        Assembly tempAssembly = null;

        //Before loading the assembly, check all current loaded assemblies in case already loaded
        //has already been loaded as a reference to another assembly
        //Loading the assembly twice can cause major issues
        foreach (Assembly loadedAssembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            //Check the assembly is not dynamically generated as we are not interested in these
            if (loadedAssembly.ManifestModule.GetType().Namespace != "System.Reflection.Emit")
            {
                //Get the loaded assembly filename
                string loadedFilename = loadedAssembly.CodeBase.Substring(loadedAssembly.CodeBase.LastIndexOf('/') + 1);

                //If the filenames match, set the assembly to the one that is already loaded
                if (loadedFilename.ToUpper() == file.Name.ToUpper())
                {
                    tempAssembly = loadedAssembly;
                    break;
                }
            }
        }

        //If the assembly is not aleady loaded, load it manually
        if (tempAssembly == null)
        {
            tempAssembly = Assembly.LoadFrom(file.FullName);
        }

        Assembly a = tempAssembly;

後でメソッドを実行すると、これがあります

private IEnumerable<IUniversalDataAdapter> DataAdapters
{
    get
    {
        foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach (var type in asm.GetTypes().Where(x => x.GetInterfaces().Contains(typeof(IUniversalDataAdapter))))
            {
                if (type.IsAbstract) continue; // can't create abstract classes

                if (!dataAdapters.Any(y => y.GetType().Equals(type)))
                {
                    IUniversalDataAdapter adapter = (IUniversalDataAdapter)Activator.CreateInstance(type);
                    dataAdapters.Add(adapter);
                }
            }
        }
        return dataAdapters;
    }
}

これにより、データアダプターが正常に読み込まれ、期待どおりに使用できるようになります。

さて、質問ですが、コードの最初のビットに次の行があります

var tempfiles = dir.GetFiles("*Adapter*.dll", SearchOption.AllDirectories);

に変更すると

var tempfiles = dir.GetFiles("*.dll", SearchOption.AllDirectories);

コードの2番目のビットがこのルーチンで実行される前に、ルーチンがクラッシュします

private IEnumerable<IDataValidator> DataValidators
{
    get
    {
        if (validators.Count == 0)
        {
            foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
            {
                foreach (var type in asm.GetTypes().Where(x => x.GetInterfaces().Contains(typeof(IDataValidator))))
                {
                    if (!type.IsAbstract)
                    {
                        var validator = (IDataValidator)Activator.CreateInstance(type, context);
                        validators.Add(validator);
                    }
                }
            }
        }
        return validators;
    }
}

編集:例外を追加しました

System.Reflection.ReflectionTypeLoadException was unhandled
  HResult=-2146232830
  Message=Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  Source=mscorlib
  StackTrace:
     at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
     at System.Reflection.RuntimeModule.GetTypes()
     at System.Reflection.Assembly.GetTypes()
     at TTi.Data.Pipeline.Server.Common.DataPipeline.get_DataValidators() in C:\Users\anorcross\Source\Workspaces\Universal System\Data\Main\TTi.Data\TTi.Data.Pipeline.Server.Common\DataPipeline.cs:line 124
     at TTi.Data.Pipeline.Server.Common.DataPipeline.CheckConfiguration(DataConfiguration config) in C:\Users\anorcross\Source\Workspaces\Universal System\Data\Main\TTi.Data\TTi.Data.Pipeline.Server.Common\DataPipeline.cs:line 528
     at TTi.Data.Pipeline.Server.Common.DataPipeline.ProcessDataSource(IDataSource dataSource, DataConfiguration config) in C:\Users\anorcross\Source\Workspaces\Universal System\Data\Main\TTi.Data\TTi.Data.Pipeline.Server.Common\DataPipeline.cs:line 213
     at TTi.Data.Test.Program.ImportTest(String testFolders) in C:\Users\anorcross\Source\Workspaces\Universal System\Data\Main\TTi.Data\TTi.Data.Test\Program.cs:line 362
     at TTi.Data.Test.Program.Main(String[] args) in C:\Users\anorcross\Source\Workspaces\Universal System\Data\Main\TTi.Data\TTi.Data.Test\Program.cs:line 48
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
     at System.Threading.ThreadHelper.ThreadStart()
InnerException: 

EndEdit:

DataValidators間違いなく前に実行されますDataAdaptersルーチン。DataValidatorsは、メインコードベースに含まれるコードのほんの一部であり、インポートされたデータが期待される形式であることを確認します。この時点で、必要なものが存在することを確認できるように、それらをロードしているだけです。

ロードされたアセンブリを見ると、両方のバージョンのコードが必要に応じてアダプターをロードしますが、2番目のバージョンは最初のバージョンよりも多くロードされます。

では、なぜtempfilesコードの完全に無関係な部分のように見えるもので2番目のバージョンのクラッシュ発生するのでしょうか。また、十分なデータアダプターを追加すると、コードがクラッシュしますか?

ラファール

この例外は、必要なdllが見つからなかったため、ロードできないことを示しています。今、彼が探していたdllと、それがコンパイルに失敗しなかった理由は何ですか?最初の質問に答えるには、より深く調査する必要があり、最終的には、コードが使用していない、または必要のない奇妙なdllをロードしていることがわかります。これは、ロードされたすべてのアセンブリのすべてのタイプで反復するコードが原因で発生する可能性があります。参照していない他のdllの一部の型を使用する型を公開するdllを参照として持つことができます。そして、そのタイプを使わない限りは問題ありません。

これを修正するには、ループをより具体的にします。アダプターがどのシステムdllでも宣言されないことは明らかですが、なぜそれらを繰り返すのでしょうか。

foreach (var asm in AppDomain.CurrentDomain.GetAssemblies().Where(IsMyAssembly))
            {
                foreach (var type in asm.GetTypes().Where(x => x.GetInterfaces().Contains(typeof(IDataValidator))))
                {
//...

最初のファイルスキャンAdapterは、より具体的であるため、それを使用しない場合よりも優れていますたとえば、一部の構成ファイルに型を明示的に登録することで、コードをさらに具体的にすることをお勧めします。これにより、dllスキャンが完全に排除されます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

迅速に、より多くのデータをテーブルビューにロードすると、スクロールラグが発生します

分類Dev

Visual Studioデバッガーは、クラッシュが発生するコード行の前にコード行を表示しなくなりました

分類Dev

コードのブロックを関数に変換するとエラーが発生します

分類Dev

コードブロックを閉じるときに、このエラーが発生します

分類Dev

@BatchSizeですが、@ ManyToOneアソシエーションをフェッチするときに多くのラウンドトリップが発生します

分類Dev

このコードを使用してWebページに画像をアップロードしようとすると、エラーが発生し続けます

分類Dev

Swift:ハッシュ可能なプロトコルにクラスのObjectIDを使用すると、set.containsメソッドでランダムな動作が発生します。コードの何が問題になっていますか?

分類Dev

Pythonクラッシュコースからコードを実行しようとすると、pygameでこのエラーが発生します(例外が発生しました:AttributeError)

分類Dev

このコードをワークブックに追加すると、エラーが発生しました

分類Dev

PythonとChromeドライバーを使用してより多くのコンテンツを複数回ロードするには、Webサイト上の特定のオブジェクトをクリックする必要があります

分類Dev

多くのスレッドでリストボックスにアイテムを追加するときにエラーが発生しました

分類Dev

postgresで「IN()」を使用して多くの行を更新するときにデッドロックが発生する可能性はありますか?

分類Dev

より多くのピクセルを使用すると、Neopixelサンプルコードがクラッシュする

分類Dev

バックスラッシュでsedコマンドを使用すると、AWSCloudFormationテンプレートの検証エラーが発生します

分類Dev

クラッシュが発生した直後にFirebaseCrashlyticsレポートを強制的にアップロードすることはできますか?

分類Dev

「アプリケーションがメインスレッドで多くの作業を行っている可能性があります」をスクロールすると、リストビューがクラッシュします。

分類Dev

Pythonでjsonをロードして操作しようとすると多くのエラーが発生します

分類Dev

'nvarchar'の近くの構文が正しくありません。グリッドビューを使用してデータベーステーブルのフィールドを更新しようとすると、このエラーが発生します

分類Dev

Windowsバッチを使用して長い文字列をクリップボードにコピーすると、「コマンドの構文が正しくありません」というエラーが発生します

分類Dev

マルチプロセッシングによりPythonがクラッシュし、fork()が呼び出されたときに別のスレッドでエラーが発生していた可能性があります

分類Dev

Pharo Smalltalkのシーサイド-例外が発生したときに「クラシック」デバッガー(エラーハンドラー)を開くことができるようにするにはどうすればよいですか?

分類Dev

Http GETリクエストにURLEncoderを使用している場合、適切なURLを取得していますが、そのコードをライブまたはサーバーにプッシュするとエラーが発生します

分類Dev

ホーム/インデックス ビュー以外のビューをロードしようとすると 500 エラーが発生する

分類Dev

ffmpegとlibvpxを使用して多くの画像からwebmをエンコードするときにエラーが発生しました

分類Dev

コンシューマウィジェット(プロバイダーパッケージ)内のナビゲーターで置換をプッシュしようとすると、「ビルド中にsetState()またはmarkNeedsBuild()が呼び出されました」エラーが発生しました

分類Dev

Qtプロジェクトのビルドディレクトリを変更すると、多くのリンカーエラーが発生します

分類Dev

マルチプロセッシングPythonコードを実行すると、cProfileによってpickle化エラーが発生します

分類Dev

ユーザーとパスワードのハッシュを登録しようとすると、「value」の近くの誤った構文を読み取るときにエラーが発生しました

分類Dev

Linuxmintで開始されたc ++コードをEclipseのあるWindowsに変更しようとすると、スタックエラーが発生します

Related 関連記事

  1. 1

    迅速に、より多くのデータをテーブルビューにロードすると、スクロールラグが発生します

  2. 2

    Visual Studioデバッガーは、クラッシュが発生するコード行の前にコード行を表示しなくなりました

  3. 3

    コードのブロックを関数に変換するとエラーが発生します

  4. 4

    コードブロックを閉じるときに、このエラーが発生します

  5. 5

    @BatchSizeですが、@ ManyToOneアソシエーションをフェッチするときに多くのラウンドトリップが発生します

  6. 6

    このコードを使用してWebページに画像をアップロードしようとすると、エラーが発生し続けます

  7. 7

    Swift:ハッシュ可能なプロトコルにクラスのObjectIDを使用すると、set.containsメソッドでランダムな動作が発生します。コードの何が問題になっていますか?

  8. 8

    Pythonクラッシュコースからコードを実行しようとすると、pygameでこのエラーが発生します(例外が発生しました:AttributeError)

  9. 9

    このコードをワークブックに追加すると、エラーが発生しました

  10. 10

    PythonとChromeドライバーを使用してより多くのコンテンツを複数回ロードするには、Webサイト上の特定のオブジェクトをクリックする必要があります

  11. 11

    多くのスレッドでリストボックスにアイテムを追加するときにエラーが発生しました

  12. 12

    postgresで「IN()」を使用して多くの行を更新するときにデッドロックが発生する可能性はありますか?

  13. 13

    より多くのピクセルを使用すると、Neopixelサンプルコードがクラッシュする

  14. 14

    バックスラッシュでsedコマンドを使用すると、AWSCloudFormationテンプレートの検証エラーが発生します

  15. 15

    クラッシュが発生した直後にFirebaseCrashlyticsレポートを強制的にアップロードすることはできますか?

  16. 16

    「アプリケーションがメインスレッドで多くの作業を行っている可能性があります」をスクロールすると、リストビューがクラッシュします。

  17. 17

    Pythonでjsonをロードして操作しようとすると多くのエラーが発生します

  18. 18

    'nvarchar'の近くの構文が正しくありません。グリッドビューを使用してデータベーステーブルのフィールドを更新しようとすると、このエラーが発生します

  19. 19

    Windowsバッチを使用して長い文字列をクリップボードにコピーすると、「コマンドの構文が正しくありません」というエラーが発生します

  20. 20

    マルチプロセッシングによりPythonがクラッシュし、fork()が呼び出されたときに別のスレッドでエラーが発生していた可能性があります

  21. 21

    Pharo Smalltalkのシーサイド-例外が発生したときに「クラシック」デバッガー(エラーハンドラー)を開くことができるようにするにはどうすればよいですか?

  22. 22

    Http GETリクエストにURLEncoderを使用している場合、適切なURLを取得していますが、そのコードをライブまたはサーバーにプッシュするとエラーが発生します

  23. 23

    ホーム/インデックス ビュー以外のビューをロードしようとすると 500 エラーが発生する

  24. 24

    ffmpegとlibvpxを使用して多くの画像からwebmをエンコードするときにエラーが発生しました

  25. 25

    コンシューマウィジェット(プロバイダーパッケージ)内のナビゲーターで置換をプッシュしようとすると、「ビルド中にsetState()またはmarkNeedsBuild()が呼び出されました」エラーが発生しました

  26. 26

    Qtプロジェクトのビルドディレクトリを変更すると、多くのリンカーエラーが発生します

  27. 27

    マルチプロセッシングPythonコードを実行すると、cProfileによってpickle化エラーが発生します

  28. 28

    ユーザーとパスワードのハッシュを登録しようとすると、「value」の近くの誤った構文を読み取るときにエラーが発生しました

  29. 29

    Linuxmintで開始されたc ++コードをEclipseのあるWindowsに変更しようとすると、スタックエラーが発生します

ホットタグ

アーカイブ