我认为我使用了一种非常常见的模式:
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。或者有没有办法忽略错误?
答案 0 :(得分:5)
在这样的问题中解析整个appdomain将扫描所有已加载的dll,如果它们未在您的应用程序中使用,则所有类型的所有类型都将被加载事件。我不会说流利的德语,但我认为错误意味着找不到EF dll。需要加载一些代码未使用的类,并在appdomain中加载的某个dll中声明它需要EF。你说你使用Telerik,也许它有一些直接使用EF的控件?
如果您只想扫描您的dll,那么简单的解决方案就是引入程序集名称的约定。假设您的所有dll都将命名为OfflerCompany.ProjectName.Something
并扫描OfflerCompany
的dll名称。
另请注意,dll会延迟加载到appdomain,因此如果您希望所有dll都存在,您可能会感到失望(如果所有直接使用或者至少一次使用,可能已经存在)。
您可能需要考虑包含需要扫描的所有dll名称的crrating配置文件。这是我最喜欢的最干净,最透明的解决方案。