2016-10-04 91 views
1

我想將C#函數存儲在DLL文件中,稍後使用參數調用該函數。到目前爲止,我已經能夠給函數存儲在一個DLL文件用下面的代碼:將函數存儲在DLL文件中

var codeProvider = new CSharpCodeProvider(); 
var icc = codeProvider.CreateCompiler(); 
var parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.OutputAssembly = "Sum.dll"; 
icc.CompileAssemblyFromSource(parameters, code); 

在DLL文件中的函數(可變碼值以上):

public class Function : IFunc 
{ 
    public string ID 
    { 
     get { return ""Sum""; } 
    } 
    public string Name 
    { 
     get { return ""Sum""; } 
    } 
    public string Description 
    { 
     get { return ""Return the sum of the values specified in args""; } 
    } 

    public ResultSet Execute(params string[] args) 
    { 
     var sum = 0; 
     foreach(var arg in args) 
     { 
      var rslt = 0; 
      if(int.TryParse(arg, out rslt)) 
      { 
       sum += rslt; 
      } 
     } 

     ResultSet rtn = new ResultSet(); 
     rtn.Result = sum.ToString(); 
     rtn.Type = ""int""; 

     return rtn; 
    } 
} 

我已經使用Assembly.LoadFile加載DLL並使用反射來獲取包含函數的類。我也有2個相同的接口,一個在我的項目,一個在DLL文件:

public interface IFunc 
{ 
    string ID { get; } 
    string Name { get; } 
    string Description { get; } 
    string Execute(params string[] args); 
} 

爲了能夠叫我使用的功能:異常的

public static IFunc CreateSumFunction() 
{ 
    var dll = Assembly.LoadFile(@"...\Sum.dll"); 
    var func = dll.GetType("Function"); // Class containing the function 
    var instance = Activator.CreateInstance(func); 

    return (IFunc)instance; // <--- CRASH 
} 

部分:

System.Windows.Markup.XamlParseException未處理 Message ='匹配指定綁定約束的類型'GenericCoder.MainWindow'上構造函數的調用拋出異常。'行號「3」和行位置「9」。

有沒有一種方法可以解決這個問題,或者是一種完整的新方法?

+2

爲什麼在創建簡單的類庫時使用反射,然後從其他項目中引用輸出的DLL?你是用Visual Studio開發的嗎? –

+0

不,我不能,DLL在運行時創建,並在運行時使用,而不是在項目設計 –

+0

您是否試圖實施Addin功能? –

回答

0

將您的庫添加到項目的引用。然後,您可以在不需要反射的情況下使用這些功能。

+1

OP是動態創建代碼的。 –

+0

請不要僅因爲OP使用了錯誤的標題而下降了這個問題 –

+0

@PanagiotisKanavos:沒有人低估了這個問題。只有這個答案,因爲它不清楚問題的重點是什麼。 – codelab