2

私は非常に一般的なパターンを使用したと思います:

var result = from a in AppDomain.CurrentDomain.GetAssemblies()
                         from t in a.GetTypes()
                         where t.IsDefined(typeof(TAttribute), inherit)
                         select t;

Program.csからコードを呼び出すと、機能します。

また、フォームから呼び出すと、フォームによっては機能する場合があります。時々それはエラーを投げるだけです:Mindestens ein Typ in der Assembly kann nichtgeladenwerden。Rufen Sie die LoaderExceptions-Eigenschaft ab、wennSieweitereInformationenbenötigen。

詳細には次の情報があります。

{"Die Datei oder Assembly \" EntityFramework、Version = 4.2.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089 \"odereineAbhängigkeitdavonwurdenichtgefunden。DasSystemkann die angegebene Datei nicht finden。": "EntityFramework、Version = 4.2 .0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089 "}

これは私にとってどういうわけか少し素晴らしいです。私の知る限り、EntityFrameworkはどこにも使用せず、ERとしてはTelerikのみを使用しています。

プロジェクトディレクトリで「findstr/s / i/mentityframework 」を実行しました。

おかしなことに、Sybasedll「SQLAnywhere12\iAnywhere.Data.SQLAnywhere.v4.0.dll」で検出されました。

わかりました-これは、SybaseSQLデータプロバイダーに少し似ているようです。しかし、私が見る限り、EntityFrameworkは必要なく、プロジェクトも期待どおりに機能します。

この問題を解決するにはどうすればよいですか?言っているように:私はAppdomainを解析したいのですが、いくつかのサードパーティのdllは解析しません。または、エラーを無視する方法はありますか?

4

1 に答える 1

5

このような問題でappdomain全体を解析すると、ロードされているすべてのdllがスキャンされ、アプリケーションで使用されていない場合、すべてのタイプがロードされます。私はドイツ語に堪能ではありませんが、エラーは EF dll が見つからなかったことを意味していると思います。コードで使用されていないクラスをロードする必要があり、appdomain にロードされている dll で宣言されており、EF が必要です。Telerik を使用しているとのことですが、EF を直接利用するコントロールがいくつかあるのではないでしょうか?

dll のみをスキャンする場合の簡単な解決策は、アセンブリ名の規則を導入することです。すべてのdllに名前が付けられOfflerCompany.ProjectName.Something、dll名をスキャンするとしOfflerCompanyます。

また、dll は appdomain に遅延ロードされるため、すべての dll が存在することを期待するとがっかりする可能性があることに注意してください (すべてが直接または少なくとも 1 回使用されていない場合は、既に存在する可能性があります)。

スキャンする必要があるすべての dll の名前を含む構成ファイルを作成することを検討してください。これは、私が好む最もクリーンで透過的なソリューションです。

于 2012-11-26T08:40:16.173 に答える