首页 > 解决方案 > 在新域中无法 GetTypes()

问题描述

我创建了一个新域,然后将程序集加载到该域中,但是当 GetTypes() 出现如图所示的错误时,希望大家帮忙,谢谢。代码

public class Program
{       
    public static void Main()
    {
        string assemblyPath = @"D:\Github\BeyConsPlugin\BeyConsProject\bin\x64\Debug\BeyConsRevitProject.dll";
        AppDomain appDomain = CreateChildDomain(AppDomain.CurrentDomain, Guid.NewGuid().ToString());
        appDomain.AssemblyResolve += AssemblyResolve;
        var value = (Proxy)appDomain.CreateInstanceAndUnwrap(typeof(Proxy).Assembly.FullName, typeof(Proxy).FullName);
        var assembly = value.GetAssembly(assemblyPath);
        var types = assembly.GetTypes();
        Console.ReadKey();
    }

    private static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
        AssemblyName assemblyName = new AssemblyName(args.Name);
        string dependentAssemblyFilename = Path.Combine(@"D:\Github\BeyConsPlugin\BeyConsProject\bin\x64\Debug", assemblyName.Name + ".dll");
        if (File.Exists(dependentAssemblyFilename)) return null;
        return Assembly.LoadFile(dependentAssemblyFilename);
    }

    public static AppDomain CreateChildDomain(AppDomain parentDomain, string domainName)
    {
        Evidence evidence = new Evidence(parentDomain.Evidence);
        AppDomainSetup setup = parentDomain.SetupInformation;
        return AppDomain.CreateDomain(domainName, evidence, setup);
    }
}

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFile(assemblyPath);
        }
        catch { return null; }
    }
}

错误

在此处输入图像描述

在此处输入图像描述

标签: c#

解决方案


您是否检查过 BeyConsRevitProject.dll 程序集是否在应用程序的 bin 目录中?这是一个可能的原因。尝试删除 bin/ 和 obj/ 文件夹并重建您的解决方案,如果错误仍然存​​在,请使用以下代码确定错误的真正原因:

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}

Ben Gripka 在此处建议了此代码: 错误消息“无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。


推荐阅读