-1

所以我正在寻找一种从 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!";
    }
}
4

3 回答 3

0

我想补充一点,正如您所怀疑的那样,使用 DynamicInvoke 非常慢,应该尽可能避免: 直接调用委托、使用 DynamicInvoke 和使用 DynamicInvokeImpl 有什么区别?

于 2013-07-16T22:47:03.350 回答
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正在做某事来生成 aint您只需要使用正确的方法签名。

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 in 计算的值传递给您传入的函数,它将为您提供该函数的结果。

于 2013-07-16T22:14:30.083 回答
0

不完全确定您在这里尝试做什么,也许您是 C# 新手。

您是否尝试引用您没有编写的 dll?,只需在项目中添加对 dll 的引用即可。如果也是用 c# 编写的,它通常可以工作。提醒一下,作为 SDK 的一部分,可以包含大量 dll 以适应您的项目。这里有一个视频来解释它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");
   }
 }
于 2016-03-11T20:19:28.100 回答