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

情况:

  • 我合并了两个程序集:Functionality.dll和Models.dll
  • 功能调用:
    RazorEngine.Razor.Parse(“模板”,newmodels.Model())
    (简化) (Functionality.dll引用Models.dll和RazorEngine.添加到GAC.Merged程序集中,但不是出于各种原因)
  • 合并的程序集上载到第三方工具。此第三方工具将此合并dll动态加载到其appdomain并执行它
  • 结果:引发异常:
    无法编译模板。找不到类型或命名空间名称“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();