gpt4 book ai didi

c# - 如何将 XmlIncludeAttribute 应用于 TypeBuilder?

转载 作者:可可西里 更新时间:2023-11-01 08:24:19 25 4
gpt4 key购买 nike

我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com