.NET - 已加载程序集的文件或程序集无法加载

4

.NET如何解析动态编译在内存中的程序集所引用的程序集。

我在托管Razor视图引擎,并使用它即时编译视图,但是无法将其引用到主项目的程序集。在编译参数中,我添加了一个对项目程序集的引用,类似于下面这样:

// Add references to all currently loaded assemblies
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
    compileParams.ReferencedAssemblies.Add(a.Location);
}

代码编译和运行正常,只要我不引用项目DLL中的任何类型 - 如果引用了,则会出现以下错误:
"无法加载文件或程序集'MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'或该程序集的某个依赖项。系统找不到指定的文件。"
我已经仔细检查,在抛出异常的地方已经加载了此程序集。我错过了什么?

你的程序集公钥令牌在哪里?你是手动将它们添加到配置文件中还是通过IDE添加的? - George Johnston
我已经尝试过有符号和无符号汇编,但没有任何区别。 - Brad Robinson
2个回答

2

已经搞定了。主要项目是一个dll,由不同目录中的exe加载。.NET程序集加载器默认搜索exe目录但不搜索dll目录。通过一个AppDomain.CurrentDomain.AssemblyResolve事件解决了这个问题,该事件搜索项目dll所在的文件夹。


使用 LoadFile 吗?不要,这很邪恶。 - Hans Passant

1
从代码中看,似乎您正在创建一个单独的AppDomain来托管动态编译的内存中程序集。
可能是您动态编译的程序集引用了主应用程序没有的程序集。尝试将异常转换为ReflectionTypeLoadException并检查LoaderExceptions是否提供了线索。

实际上,这全部都在一个应用程序域中。 - Brad Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接