所以我正在寻找一种从dll外部调用应用程序中的方法的方法。 (见下面的例子)这就是我正在尝试的但它是a)不工作b)如果它正在工作我感觉调用DynamicInvoke将会非常缓慢。
首先如果我确实想要这样做,我该如何处理返回类型,因为目前这会出现错误,说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 :(得分: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进行计算的值传递给你传入的函数,它将为你提供该函数的结果。
答案 1 :(得分:0)
我想补充一点,正如您所怀疑的那样,使用DynamicInvoke非常慢,如果可能的话应该避免使用: What is the difference between calling a delegate directly, using DynamicInvoke, and using DynamicInvokeImpl?
答案 2 :(得分:0)
不完全确定你在这里尝试做什么,也许你是C#的新人。
你试图引用你没写过的dll吗?只需在项目中添加对dll的引用即可。如果也用c#编写,它通常有效。 提醒一下,作为SDK的一部分,有大量的dll可以包含在适合您项目的方式中。这是一个解释它的视频https://www.youtube.com/watch?v=gmz_K9iLGU8
如果您想在外部执行另一个程序
<main>
<router-outlet></router-outlet>
</main>