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 nicht geladen werden。Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen benötigen。

详细信息中有以下信息:

{"Die Datei oder Assembly \"EntityFramework, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.":"EntityFramework, Version=4.2 .0.0,文化=中性,PublicKeyToken=b77a5c561934e089"}

这对我来说有点不可思议。据我所知,我们不在任何地方使用 EntityFramework,只有 Telerik 作为 ER。

我在 projekt 目录中做了一个“findstr /s /i /m entityframework . ”。

有趣的是,它在 Sybase dll“SQL Anywhere 12\iAnywhere.Data.SQLAnywhere.v4.0.dll”中找到了它。

好吧 - 这看起来有点像 sybase sql 数据提供程序。但据我所知,我们不需要 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 都存在,您可能会感到失望(如果所有直接使用或至少一次不使用,则可能已经存在)。

您可能需要考虑创建包含需要扫描的所有 dll 名称的配置文件。这是我喜欢的最干净、最透明的解决方案。

于 2012-11-26T08:40:16.173 回答