c# - 动态模块不支持调用的成员

标签 c# reflection.emit

运行此代码时出现错误:

  var asmName = new AssemblyName("DynamicAssembly");
  var asmBuilder = AssemblyBuilder.DefineDynamicAssembly
      (asmName, AssemblyBuilderAccess.Run);
  var moduleBuilder = asmBuilder.DefineDynamicModule("DynamicModule");
  var typeBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public);
  var methodBuilder = typeBuilder.DefineMethod("DynamicMethod", MethodAttributes.Static, typeof(double), new[] { typeof(double), typeof(double), typeof(double) });
  myexp.Lambda.CompileToMethod(methodBuilder);
  asmBuilder.SetEntryPoint(methodBuilder);

  MethodInfo barMethod = asmBuilder.EntryPoint;
  result = barMethod.Invoke(null, new object[] { 50d, 1d, 3d });

我在最后一行收到错误

The invoked member is not supported in a dynamic module.

我只是想调用该方法。

我添加

  <runtime>
    <loadFromRemoteSources enabled="true"/>
  </runtime>

我的app.config无济于事。

最佳答案

正如 @thehennyy 在评论中指出的那样,您应该在调用方法之前调用 typeBuilder.CreateType() ,但是从 methodBuilder 调用 Invoke 会导致相同的结果错误。

从创建的类型获取方法后,我成功地调用了方法,如下所示:

var type = typeBuilder.CreateType();
var method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic);

这是我使用过的完整代码:

Expression<Func<double, double, double, double>> myexp = (a, b, c) => a * b * c;
var methodName = "DynamicMethod";

var asmName = new AssemblyName("DynamicAssembly");
var asmBuilder = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
var moduleBuilder = asmBuilder.DefineDynamicModule("DynamicModule");
var typeBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public);
var methodBuilder = typeBuilder.DefineMethod(methodName, MethodAttributes.Static, typeof(double), new[] { typeof(double), typeof(double), typeof(double) });

myexp.CompileToMethod(methodBuilder);
var type = typeBuilder.CreateType();
var method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic);

asmBuilder.SetEntryPoint(method);
MethodInfo barMethod = asmBuilder.EntryPoint;
var result = barMethod.Invoke(null, new object[] { 50d, 1d, 3d });

关于c# - 动态模块不支持调用的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396119/

相关文章:

c# - 从另一个 AppDomain 的程序集中复制方法并从 CurrentDomain 执行它

c# - ASP.NET/C# 中的服务器端麦克风捕获

c# - 扩展方法 : IXmlLineInfo 出现问题

c# - 发出局部变量并为其赋值

.net - 在运行时创建一个类并在.Net 中使用它?

c# - 如何发出对 [mscorlib]System.Console::Write(char) 的调用?

c# - 矩阵乘法算法

c# - Roslyn SyntaxNodes 是否被重用?

c# - LINQ删除错误(C#)

c# - 使用反射定义具有 typeof 嵌套类型的属性