运行此代码时出现错误:
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/