2017-09-25 121 views
1

我的錯誤中不支持調用的成員,當我運行這段代碼:動態模塊

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無濟於事。

+0

你能提供'myexp'或一個精簡的版本,使您的剪輯可編譯? – thehennyy

+3

不應該把typeBuilder.CreateType()放在什麼地方? –

+0

@RegisPortalez,我首先嚐試了,實際上。 '.Createtype()'的類型在它的'Members'集合中沒有該方法。 – toddmo

回答

2

正如@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 });