Tag: reflection.emit

生成一个带有参数的构造函数,并使用TypeBuilder调用base(argument)

我试图动态创建一个空构造函数,它接受一个参数,并使用TypeBuilder简单地调用base(参数)。 我的代码是这样的: (…) // Create a class derived from this class TypeBuilder typeBuilder = moduleBuilder.DefineType(“NewClass”, TypeAttributes.Class, this.GetType()); ConstructorInfo baseCtor = this.GetType().GetConstructor(new[] { typeof(int) }); // Define new ctor taking int ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new[] { typeof(int) }); // Generate code to call base ctor passing int ILGenerator ctorIL = constructorBuilder.GetILGenerator(); ctorIL.Emit(OpCodes.Ldarg_0); ctorIL.Emit(OpCodes.Ldarg_1); ctorIL.Emit(OpCodes.Call, […]

如何发出返回ref的动态方法?

我正在浏览ref返回的来龙去脉,并且无法发出一个由ref返回的动态方法。 手工制作的lambdas和现有方法按预期工作: class Widget { public int Length; } delegate ref int WidgetMeasurer(Widget w); WidgetMeasurer GetMeasurerA() { return w => ref w.Length; } static ref int MeasureWidget(Widget w) => ref w.Length; WidgetMeasurer GetMeasurerB() { return MeasureWidget; } 但是发出动态方法失败了。 注意 :我在这里使用Sigil 。 道歉,我对System.Reflection.Emit不太熟悉。 WidgetMeasurer GetMeasurerC() { FieldInfo lengthField = typeof(Widget).GetField(nameof(Widget.Length)); var emitter = Emit.NewDynamicMethod() .LoadArgument(0) .LoadFieldAddress(lengthField) […]

Expression.DebugInfo如何标记表达式?

所以我知道Expression.DebugInfo用于什么,我创建了一个Debug表达式,但是如何用这个调试信息标记其他表达式? 这是我正在尝试的一个非常基本的测试: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Reflection; namespace ExpressionDebugTest { class Program { static void Main(string[] args) { var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(“foo”), System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave); var mod = asm.DefineDynamicModule(“mymod”, true); var type = mod.DefineType(“baz”, TypeAttributes.Public); var meth = type.DefineMethod(“go”, MethodAttributes.Public | MethodAttributes.Static); var sdi = Expression.SymbolDocument(“TestDebug.txt”); var di = […]

从TypeBuilder创建具有基类和附加字段的动态类型会生成exception

我正在尝试基于仅包含公共字段的现有类型创建动态类型。 新的动态类型还必须从仅具有完全实现的方法的不同基类型inheritance。 我创建TypeBuilder指定基类型然后我将公共字段添加到它,最后我调用CreateType() 。 生成的错误消息是: “无法从程序集’MyDynamicAssembly,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null’加载类型’InternalType’,因为字段’first’未被赋予显式偏移量。” 对我来说,这意味着CreateType方法在基类中寻找公共字段“first”,这是一个问题,因为它不在那里。 为什么它认为添加的字段应该在基类中? 或者,我是否误解了这个例外? 这是代码: public class sourceClass { public Int32 first = 1; public Int32 second = 2; public Int32 third = 3; } public static class MyConvert { public static object ToDynamic(object sourceObject, out Type outType) { // get the public fields […]

reflection生成和generics类型

我在Reflection.Emit和类型管理方面又遇到了一个令人讨厌的时刻。 比如说,我有一个名为MyType的类型,它在动态生成的程序集中定义。 调用MyType.GetMethods()导致NotSupportedException ,这使我减少了编写自己的包装器和查找表的能力。 但是,当我在使用我自己的类型作为generics参数的标准generics类型上调用GetMethods()或任何其他内省方法时,也会发生同样的情况: Tuple =>工作正常 Tuple =>exception 我可以从generics类型定义中获取方法列表: typeof(Tuple<int, MyType).GetGenericTypeDefinition().GetMethods() 但是,这些方法具有通用占位符而不是实际值(如T1 , TResult等)。我不想编写另一个将通用参数追溯到其原始值的kludge。 代码示例: var asmName = new AssemblyName(“Test”); var access = AssemblyBuilderAccess.Run; var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, access); var module = asm.DefineDynamicModule(“Test”); var aType = module.DefineType(“A”); var tupleType = typeof(Tuple); var tuple = tupleType.MakeGenericType(new [] { typeof(int), aType }); tuple.GetProperty(“Item1”); // <– here's […]

正文的签名和方法实现中的声明不匹配

我想在运行时实现一个接口,但是当我执行时 return Activator.CreateInstance(typeBuilder.CreateTypeInfo().AsType(), new RPCRequestProxy()); 在它抛出的RPCClientFactory.cs中 System.TypeLoadException: Signature of the body and declaration in a method implementation do not match 。 我使用dotnet core 1.0.4。 入口点Program.cs : namespace RPC { interface IRCPClient { Task Foo([UrlParam]int b, [UrlParam]string a, [UrlParam] DateTime c); } class Program { static void Main(string[] args) { var factory = new RPCClientFactory(); factory.Register(); […]

Reflection Emit:如何将Attribute实例转换为CustomAttributeBuilder或CustomAttributeData

我创建了一个生成器类,它基于实现接口的接口构建代理类。 请参阅我在基于接口构建代理类的post而不实现它 。 我熟悉CustomAttributeData.GetCustomAttributes(MemberInfo target) ,当我读取Interface的成员并成功将它们导入代理时,我使用它。 我想在运行时向生成的类注入其他属性。 我要求将属性实例注入代理中。 例如: 开发人员可以将其作为值传递: new ObsoleteAttribute(“Demo”, true) ,(它有一个空构造函数,但属性是只读的),我想将其转换为: return new CustomAttributeBuilder( attribute.GetType().GetConstructor(Type[] {typeof (string), typeof (bool)}), new object[] {“Demo”, true}, new FieldInfo[0], new object[0]); 记住,我不知道给出了什么。

可以使用Roslyn生成类似于DynamicMethod IL生成的动态方法

我一直在使用DynamiMethod来生成IL method.GetILGenerator(); 这很好用,但当然很难使用,因为你通常不想在C#这样的高级语言中使用低级别的IL。 现在,因为有罗斯林,我可以使用它。 我试图找出如何使用Roslyn做类似的事情:生成一个动态方法,然后为它创建一个委托。 我能做到的唯一方法是拥有这样的全class SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@” using System; namespace RoslynCompileSample { public class Writer { public void Write(string message) { Console.WriteLine(message); } } }”); 然后我可以使用字符串连接插入我的方法而不是Write方法。 之后,在内存中生成动态程序集并加载,并使用reflection来获取所需的方法并生成委托。 这种方法似乎工作正常但对我的情况似乎有点过分,因为我需要使用多个独立的方法,导致大量的程序集被加载。 所以问题是:是否有一种简单的方法可以为Roslyn执行类似于动态方法的操作,这样我只能定义附加到类型的方法体? 如果没有,编译许多动态程序集有什么大的缺点(比如太多无法加载等等)

NHibernate / Fluent NHibernate动态列映射

我有一个表,其中一些列在编译时是未知的。 这些列可以是整数值,也可以是某个枚举值。 有一个表包含此类动态列的所有名称,并且还包含列的类型。 这个“metatable”有以下几列: DynamicColumnId(Pk) 名称 TypeId(整数/枚举,从单独的表中作为Fk) 整数列具有此表中的名称 ,而Enum列是来自具有该名称的表的Fk列,具有一些修改(例如“DynamicTable”前缀)。 我能想到的唯一解决方案是使用Reflection.Emit动态创建一个Entity类和一个相应的Mapping类。 不可否认,我是NHybernate / Fluent NHybernate的新手,它似乎是表之间相对简单的层次结构,所以我想validation我的解决方案并不像最初看起来那样难看…… 我也欢迎完全忽略我的表层次结构的解决方案,以便有效地实现相同的结果(即,枚举动态表上的行,遍历所有列,知道它们是否是枚举,如果它们是,他们可能的价值观)。 ( 编辑:附加信息问题域 )我最初包含最少的细节,以避免太多信息相关的混淆。 这种描述要复杂得多,但它揭示了这种设计背后的动机。 涉及的应用程序旨在自动化日志/转储分析。 分析场景经常由日志/转储专家提供,因此,为了简化需求=>实现=>validation周期的典型过程,这些分析场景由专家直接实现为Iron Python代码片段,一些特定于域的构造注入到片段的范围内。 每个片段都有一个与其相关的“上下文”。 “上下文”的一个例子可能是“产品”,“版本”等……所以,代码片段本身只在某些上下文中调用 – 这有助于通过消除分支来简化Python代码(您可以将其视为面向方面编程, 在某种程度上)。 在为各种上下文选择值之后,非专家可以使用具有给定代码上下文数据库的应用程序来分析日志/转储。 当专家决定为某个代码片段编目需要新的上下文时,他可以添加一个上下文,指示它可能具有的值。 将新上下文添加到数据库后,将为运行分析的非专家提供为新添加的上下文选择值的选项。 “动态表”是将代码段与发布代码段时存在的各种上下文(列)的值相关联的表,以及当时不存在的列的默认值。

将一个对象属性值转移到另一个对象属性值

最重要的是,我知道AutoMapper ,我不想使用它。 因为我正在学习C# ,我想深入了解它。 所以我正试着自己做这个问题(下面解释)。 但是,我正在尝试创建一个属性复制器来处理一种类型属性的值到另一种属性,如果该属性具有相同的名称和类型,并且可以从源中读取并在目标中可写。 我正在使用type.GetProperties()方法。 采样方法如下: static void Transfer(object source, object target) { var sourceType = source.GetType(); var targetType = target.GetType(); var sourceProps = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance); var targetProps = (from t in targetType.GetProperties() where t.CanWrite && (t.GetSetMethod().Attributes & MethodAttributes.Static) == 0 select t).ToList(); foreach(var prop in sourceProps) { var value = prop.GetValue(source, […]