1

実行時に、設定した特定のアセンブリ属性に一致する dll をプログラムにロードしようとしています。フラグをチェックする前に dll がロード可能であることを確認するために、次のメソッドを作成しました。

private bool IsValidDll(string dll) {
        try {
            System.Reflection.Assembly.LoadFrom(dll);
            return true;
        } catch (Exception ex) { return false; }
    }

現在のディレクトリ内の dll をループしてこのメ​​ソッドを呼び出し、dll を安全にロードしてそのアセンブリ属性をチェックできるかどうかを確認できます。ただし、例外をスロー/キャッチしておらず、プログラムを直接クラッシュさせているdllにアクセスしています。関連する出力ウィンドウ情報は次のとおりです。

LoaderException: System.IO.FileLoadException: Mixed mode assembly is built against 
version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information. - Adapters.Spryware.SprywareAdapter
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

特定の例外 (System.IO.FileLoadException) をキャッチしようとしましたが、キャッチ ブロックがまだスキップされ、クラッシュします。何かご意見は?

また、これは私のアセンブリ属性をチェックする非常に手間のかかる方法であることがわかりました。最初に Reflection で dll をロードせずにフラグをチェックする方法はありますか?

4

2 に答える 2

0

告白する必要があります、なぜあなたのコードが機能しないのかわかりません:

私は.net4のものを作成して実行し、それをキャッチしました。

    private void button1_Click(object sender, EventArgs e)
    {
       // foreach (String file in Directory.GetFiles("c:\\windows", "*.dll"))
        String file = @"C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Data.dll";
        {
            try
            {
                //System.Reflection.Assembly.ReflectionOnlyLoadFrom(file);
                System.Reflection.Assembly.LoadFrom(file);
            }
            catch (Exception ee)
            {
                textBox1.Text += ee.Message + Environment.NewLine;
            }
        }
    }

テキストボックスをクリックすると、次のように表示されます。ファイルまたはアセンブリを読み込めませんでした'file:/// C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727\System.Data.dll'またはその依存関係の1つ。間違った形式のプログラムを読み込もうとしました。

于 2012-09-26T13:52:51.583 に答える
0

アセンブリをリフレクションのみのコンテキストにロードすることで、おそらくこの問題を解決し、負担を軽減できます。

基本的に、アセンブリを完全にロードする代わりに、これにより、オブジェクトのインスタンス化などの機能を使用せずに、アセンブリを反映することができます。これにより、アプリケーションが実行されているバージョンとは異なる .NET Framework バージョンに対してビルドされたアセンブリを明示的に確認できます。

詳細については、MSDN で入手できます: http://msdn.microsoft.com/en-us/library/ms172331.aspx

于 2012-09-26T13:43:06.033 に答える