我正在用 C# 开发一个库,它使用 System.Reflection.Emit.TypeBuilder
类生成运行时类型,我想生成以下类层次结构:
[XmlInclude(typeof(Derived))]
public class Base
{
}
public class Derived : Base
{
}
我按以下方式使用 TypeBuilder 类:
class Program
{
public static void Main(string[] args)
{
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.Run);
var moduleBuilder = assembly.DefineDynamicModule("Test");
var baseTypeBuilder = moduleBuilder.DefineType("Base", TypeAttributes.Public, typeof(Object));
var derivedTypeBuilder = moduleBuilder.DefineType("Derived", TypeAttributes.Public);
derivedTypeBuilder.SetParent(baseTypeBuilder);
baseTypeBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(XmlIncludeAttribute).GetConstructor(new[] { typeof(Type) }), new[] { derivedTypeBuilder }));
var baseType = baseTypeBuilder.CreateType();
var derivedType = derivedTypeBuilder.CreateType();
var attribute = baseType.GetCustomAttribute<XmlIncludeAttribute>();
}
}
电话:
var attribute = baseType.GetCustomAttribute<XmlIncludeAttribute>();
我收到以下错误:
无法加载文件或程序集 'Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。
任何想法都很受欢迎:我如何在引用派生类的 TypeBuilder 的基类的 TypeBuilder 上应用自定义属性?
PS:我使用的是 Visual Studio 2017 (v15.7.5) 和 C# 类库(.NET Framework 项目模板)不是 .NET Core 或 .NET Standard
最佳答案
无法提供太多理由,但可以提供一个无需额外加载/卸载或任何从磁盘到磁盘的解决方案:
添加一个包含实际 Assembly
的单独字段,只需订阅 AppDomain.CurrentDomain.AssemblyResolve
并检查是否请求了动态程序集。
如果是,您只需返回您的字段,它就可以正常工作。
例子:
class Program
{
static Assembly ass;
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.Run);
var moduleBuilder = assembly.DefineDynamicModule("Test");
var baseTypeBuilder = moduleBuilder.DefineType("Base", TypeAttributes.Public, typeof(Object));
var derivedTypeBuilder = moduleBuilder.DefineType("Derived", TypeAttributes.Public);
derivedTypeBuilder.SetParent(baseTypeBuilder);
baseTypeBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(XmlIncludeAttribute).GetConstructor(new[] { typeof(Type) }), new[] { derivedTypeBuilder }));
var baseType = baseTypeBuilder.CreateType();
var derivedType = derivedTypeBuilder.CreateType();
ass = baseType.Assembly;
var attribute = baseType.GetCustomAttribute<XmlIncludeAttribute>();
Console.WriteLine(attribute.Type.FullName);
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return ass;
}
}
关于c# - 如何将 XmlIncludeAttribute 应用于 TypeBuilder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51648662/