使用Sybase时AppDomain.CurrentDomain.GetAssemblies()抛出System.Reflection.ReflectionTypeLoadException

时间:2012-11-26 08:19:51

标签: c# reflection

我认为我使用了一种非常常见的模式:

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 weitereInformationenbenötigen。

详情请见:

{“Die Datei oder Assembly \”EntityFramework,Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 \“oineeineAbhängigkeitdavonwurde nicht gefunden.Das System kann die angegebene Datei nicht finden。”:“EntityFramework, Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089“}

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

我在projekt目录中完成了“findstr / s / i / m entityframework ”。

Funilly,它已在Sybase dll“SQL Anywhere 12 \ iAnywhere.Data.SQLAnywhere.v4.0.dll”中找到它。

好吧 - 这看起来有点像sybase sql数据提供者。但据我所知,我们不需要EntityFramework,项目也按预期工作。

我该如何解决这个问题?就像说:我想解析Appdomain,但不是一些第三方dll。或者有没有办法忽略错误?

1 个答案:

答案 0 :(得分:5)

在这样的问题中解析整个appdomain将扫描所有已加载的dll,如果它们未在您的应用程序中使用,则所有类型的所有类型都将被加载事件。我不会说流利的德语,但我认为错误意味着找不到EF dll。需要加载一些代码未使用的类,并在appdomain中加载的某个dll中声明它需要EF。你说你使用Telerik,也许它有一些直接使用EF的控件?

如果您只想扫描您的dll,那么简单的解决方案就是引入程序集名称的约定。假设您的所有dll都将命名为OfflerCompany.ProjectName.Something并扫描OfflerCompany的dll名称。

另请注意,dll会延迟加载到appdomain,因此如果您希望所有dll都存在,您可能会感到失望(如果所有直接使用或者至少一次使用,可能已经存在)。

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