Dan*_*fer 72 c# assemblies appdomain
我的项目设置如下:
项目"消费者"引用"定义"和"实现",但不静态引用"实现"中的任何类型.
当应用程序启动时,Project"Consumer"在"Definition"中调用静态方法,该方法需要在"Implementation"中查找类型
有没有办法可以在不知道路径或名称的情况下强制将任何引用的程序集加载到App域中,并且最好不必使用完整的IOC框架?
Dan*_*fer 80
这似乎可以解决问题:
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var loadedPaths = loadedAssemblies.Select(a => a.Location).ToArray();
var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList();
toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));
Run Code Online (Sandbox Code Playgroud)
正如Jon指出的那样,理想的解决方案需要递归到每个已加载程序集的依赖项中,但在我的特定场景中,我不必担心它.
更新: .NET 4中包含的托管扩展性框架(System.ComponentModel)具有更好的工具来完成这样的事情.
Jon*_*eet 55
您可以使用Assembly.GetReferencedAssemblies获取AssemblyName[],然后调用Assembly.Load(AssemblyName)每个.当然,你需要递归 - 但最好跟踪你已经加载的装配:)
jme*_*hus 21
只是想分享一个递归的例子.我在我的启动例程中调用LoadReferencedAssembly方法,如下所示:
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
this.LoadReferencedAssembly(assembly);
}
Run Code Online (Sandbox Code Playgroud)
这是递归方法:
private void LoadReferencedAssembly(Assembly assembly)
{
foreach (AssemblyName name in assembly.GetReferencedAssemblies())
{
if (!AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName == name.FullName))
{
this.LoadReferencedAssembly(Assembly.Load(name));
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mei*_*hes 14
如果您使用Fody.Costura或任何其他程序集合并解决方案,则接受的答案将不起作用.
以下加载任何当前加载的Assembly的Referenced Assemblies.递归留给你.
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
loadedAssemblies
.SelectMany(x => x.GetReferencedAssemblies())
.Distinct()
.Where(y => loadedAssemblies.Any((a) => a.FullName == y.FullName) == false)
.ToList()
.ForEach(x => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(x)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60526 次 |
| 最近记录: |