从外部dll调用类中的方法

时间:2013-07-16 22:02:47

标签: c# dll

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

3 个答案:

答案 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>