2013-07-16 69 views
-2

所以我正在尋找一種方法來調用外部應用程序中的方法從DLL。 (請參閱下面的示例)這是我正在嘗試但是它是a)不工作和b)如果它工作,我有一種感覺,調用DynamicInvoke將是痛苦的緩慢。從外部DLL調用類中的方法

首先,如果我確實想這樣做,我該如何處理返回類型,因爲目前這會說錯誤,說callthisexternally()有錯誤的返回類型。

有沒有更好的方法來做到這一點?

--- within a a dll --- 
public class mydll 
{ 
    // etc.. blah blah 
    public object callfromdll(string commandName, int requiredArgs, Delegate method) 
    { 
     // do stuff 
     // now invoke the method 
     return method.DynamicInvoke(method.Method.GetParameters().Select(p => p.ParameterType).ToArray()); 
    } 
} 
-- within an application that's refrancing the above dll -- 
public someclass 
{ 
    // etc.. stuff here 
    mydll m = new mydll(); 
    m.callfromdll("callthisexternally", 0, new Action(callthisexternally)); 
    // the function to be called externally 
    public string callthisexternally() 
    { 
     // do stuff 
     return "i was called!"; 
    } 
} 
+0

你需要爲現在它沒有任何意義,以提供有關'callfromdll'更多的細節你爲什麼做這種方式而不是僅傳遞一個['Func'委託](http://msdn.microsoft.com/en-us/library/bb534960.aspx) –

+0

可能不是整個答案,而是'new Action(callthisexternally)'不起作用因爲'callthisexternally'返回一個值。你應該使用'新功能(callthisexternally)' –

+0

@DStanley刷新,我已經更新了我的評論。 –

回答

0

沒有什麼callFromDll是應該做的,你可以做到這一點簡單地用更多的細節Func Delegate

public class mydll 
{ 
    // etc.. blah blah 
    public T callfromdll<T>(string commandName, int requiredArgs, Func<T> method) 
    { 
     // do stuff 
     // now invoke the method 
     return method(); 
    } 
} 

如果您do stuff在做的東西產生int你只需要使用正確的方法siginature。現在

public class mydll 
{ 
    // etc.. blah blah 
    public T callfromdll<T>(string commandName, int requiredArgs, Func<int, T> method) 
    { 
     int x = SomeComplexFunction(commandName, requiredArgs); 
     return method(x); 
    } 
} 
-- within an application that's refrancing the above dll -- 
public someclass 
{ 
    public void test() 
    { 
     // etc.. stuff here 
     mydll m = new mydll(); 
     var result = m.callfromdll("callthisexternally", 0, new Func(callthisexternally)); 
     //result contains "i was called, and my result was #" and where # is replace with the number passed in to callthisexternally 
    } 

    // the function to be called externally 
    public string callthisexternally(int x) 
    { 
     // do stuff 
     return "i was called, and my result was " + x; 
    } 
} 

您的DLL將通過它計算X到您傳入函數的值,它會給你從函數的結果。

0

不完全相信你的努力在這裏做,也許你的新的C#所以。

你是否試圖引用你沒有寫過的dll,它的確定只是在你的項目中添加一個dll引用。如果用C#編寫它通常也可以。 提醒說有大量的dll作爲SDK的一部分,可以包含這種方式來適應您的項目。下面的視頻來解釋它https://www.youtube.com/watch?v=gmz_K9iLGU8

如果你想執行另一個程序外部

using System.Diagnostics; 
class Program 
{ 
    static void Main() 
    { 
    // Use Process.Start here. 
    Process.Start("C:\\HitchHickersGuide.exe /Towl /42"); 
    } 
}