C# ILMerge程序集并动态加载此合并的程序集
情况:C# ILMerge程序集并动态加载此合并的程序集,c#,appdomain,ilmerge,razorengine,C#,Appdomain,Ilmerge,Razorengine,情况: 我合并了两个程序集:Functionality.dll和Models.dll 功能调用:RazorEngine.Razor.Parse(“模板”,newmodels.Model())(简化) (Functionality.dll引用Models.dll和RazorEngine.添加到GAC.Merged程序集中,但不是出于各种原因) 合并的程序集上载到第三方工具。此第三方工具将此合并dll动态加载到其appdomain并执行它 结果:引发异常: 无法编译模板。找不到类型或命名空间名称“M
RazorEngine.Razor.Parse(“模板”,newmodels.Model())
(简化)
(Functionality.dll引用Models.dll和RazorEngine.添加到GAC.Merged程序集中,但不是出于各种原因)无法编译模板。找不到类型或命名空间名称“Models”。(是否缺少程序集引用?
对我来说这很奇怪,因为“Models”命名空间是合并程序集的一部分。如果我(使用调试器)检查它是否已加载。(AppDomain.CurrentDomain.GetAssemblys)。
但是:合并的程序集没有位置。(Assembly.Location=“”)。我假设这是因为它是由第三方应用程序动态加载的?这会导致RazorEngine抛出此异常,因为它会按位置(@params.referencedAssemblys.Add(locationofdl)
)添加对所有已加载程序集的引用
我的问题是:
如何确保动态加载的合并dll(正确)加载到appdomain中,以便RazorEngine可以添加对它的引用?对我来说,将合并的dll放入GAC并不方便。(我已经把它上传到我的第三方申请中了)。第三方应用程序可能有多个服务器。我知道,可以将其添加到GAC中,也许这就是GAC的用途,但我只是想知道是否可以将合并的程序集(再次?)加载到当前运行的AppDomain(具有位置?)中,以便RazorEngine可以添加对它的引用。(对吗?RazorEngine.dll与合并的dll在同一AppDomain中运行。我仔细检查了这一点)
长问题。对不起。我希望有人能给我一些建议,说明这一切是如何联系在一起的(AppDomain、动态加载、使用GAC程序集(RazorEngine)合并的程序集,需要知道合并程序集中的类型….pfft)
谢谢 这是(正如您已经注意到的)因为RazorEngine
忽略所有具有null
位置的程序集。虽然我不能给你一个确切的答案,但我可能会给你一些提示/解决方法(关于问题的RazorEngine
特定部分)
在旧版本中,您可以做的事情不多(您是否尝试过
fuslogvw
?是的,但没有效果。它没有“捕获”程序集的加载:(
class MyIReferenceResolver : IReferenceResolver {
public IEnumerable<CompilerReference> GetReferences(TypeContext context, IEnumerable<CompilerReference> includeAssemblies) {
// add all references needed by the compilation of the template
// You should include the includeAssemlies as well :)
return new [] {
CompilerReference.From("Path-to-my-custom-assembly"), // file path (string)
CompilerReference.From(typeof(MyType).Assembly), // Assembly (roslyn only in your situation)
CompilerReference.From(assemblyInByteArray), // byte array (roslyn only)
CompilerReference.From(File.OpenRead(assembly)), // stream (roslyn only)
};
}
}
config.ReferenceResolver = new MyIReferenceResolver();