从另一个dll重新加载dll函数,C#

时间:2010-07-06 14:01:54

标签: c# dll

我有2个非托管dll,它们具有完全相同的功能集(但逻辑略有不同)。

如何在运行期间在这两个ddls之间切换?

现在我有:

[DllImport("one.dll")]
public static extern string _test_mdl(string s);

4 个答案:

答案 0 :(得分:4)

在不同的C#类中定义它们?

static class OneInterop
{
 [DllImport("one.dll")]
 public static extern string _test_mdl(string s);
}

static class TwoInterop
{
 [DllImport("two.dll")]
 public static extern string _test_mdl(string s);
}

答案 1 :(得分:4)

我没有必要使用它,但我认为可以在声明中指定EntryPoint。试试这个:

    [DllImport("one.dll", EntryPoint = "_test_mdl")]
    public static extern string _test_mdl1(string s);

    [DllImport("two.dll", EntryPoint = "_test_mdl")]
    public static extern string _test_mdl2(string s);

DllImportAttribute.EntryPoint Field

答案 2 :(得分:4)

在此处扩展现有答案。您评论您不想更改现有代码。你不必这样做。

[DllImport("one.dll", EntryPoint = "_test_mdl")]
public static extern string _test_mdl1(string s);

[DllImport("two.dll", EntryPoint = "_test_mdl")]
public static extern string _test_mdl2(string s);

public static string _test_mdl(string s)
{
    if (condition)
        return _test_mdl1(s);
    else
        return _test_mdl2(s);
}

您在现有代码中继续使用_test_mdl,只需将if语句放在该方法的新版本中,调用正确的基础方法。

答案 3 :(得分:1)

您仍然可以使用动态加载并调用LoadLibraryEx(P / Invoke),GetProcAddress(P / Invoke)和Marshal.GetDelegateForFunctionPointer(System.Runtime.InterOpServices)。