Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态模块中不支持调用的成员_C#_Reflection.emit - Fatal编程技术网

C# 动态模块中不支持调用的成员

C# 动态模块中不支持调用的成员,c#,reflection.emit,C#,Reflection.emit,我在运行此代码时遇到错误: var asmName = new AssemblyName("DynamicAssembly"); var asmBuilder = AssemblyBuilder.DefineDynamicAssembly (asmName, AssemblyBuilderAccess.Run); var moduleBuilder = asmBuilder.DefineDynamicModule("DynamicModule"); var typeB

我在运行此代码时遇到错误:

  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 });
我在最后一行得到了错误

动态模块中不支持调用的成员

我只想调用这个方法

我补充说

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


调用我的
app.config
无效。

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

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

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 });
表达式myexp=(a,b,c)=>a*b*c;
var methodName=“DynamicMethod”;
var asmName=newassemblyname(“DynamicAssembly”);
var asmBuilder=AssemblyBuilder.DefinedDynamicAssembly(asmName,AssemblyBuilderAccess.Run);
var moduleBuilder=asmBuilder.defineddynamicmodule(“DynamicModule”);
var typeBuilder=moduleBuilder.DefineType(“DynamicType”,TypeAttributes.Public);
var methodBuilder=typeBuilder.DefineMethod(methodName,MethodAttributes.Static,typeof(double),new[]{typeof(double),typeof(double),typeof(double)});
CompileToMethod(methodBuilder);
var type=typeBuilder.CreateType();
var method=type.GetMethod(methodName,BindingFlags.Static | BindingFlags.NonPublic);
asmBuilder.SetEntryPoint(方法);
MethodInfo barMethod=asmBuilder.EntryPoint;
var result=barMethod.Invoke(null,新对象[]{50d,1d,3d});

你能提供
myexp
或它的精简版本,使你的剪贴版可编译吗?你不应该把typeBuilder.CreateType()放在某个地方吗?@RegisPortalez,实际上,我先试过了。
.Createtype()
中的类型在其
成员
集合中没有该方法。@toddmo从
TypeBuilder
的msdn项开始:
在使用类型之前,必须调用TypeBuilder.Createtype方法。
因此无法绕过此调用。如果您得到了未接受的结果,那么其他的东西似乎是错误的。@Thehenny,好的,我将保留我的代码,但添加那一行,看看会发生什么