c# - 在新域中无法 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; }
}
}
错误
解决方案
您是否检查过 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 属性以获取更多信息。
推荐阅读
- c# - Unity Firebase RealtimeDatabase GetValueAsync() 不返回任何内容
- java - Hibernate Java 配置 Spring Boot
- angularjs - Internet Explorer 11 中带有 ng-hide 的动画 css3 闪烁问题
- android - 单击以使用先前活动中的文档中的文本打开新活动
- azure - Azure 流分析不一致的输出
- r - 基于多个滞后或基于前 N 行创建指标变量
- logic - 骑士与无赖
- collections - kotlin中集合的可变和不可变属性有什么区别
- php - 循环,什么以及如何使用?(for、while 和 foreach)
- android - Android Exo Player 上的 RTMP 实时流元数据注入和接收问题