【问题标题】:Calling another function which is in the list of exportable functions调用可导出函数列表中的另一个函数
【发布时间】:2014-11-21 12:02:26
【问题描述】:

我编写了一个库,其中包含一些正在导出的函数。一个例子:

[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
public static void Test() {
    MessageBox.Show("Test 1");
}

[DllExport("Test2", CallingConvention = CallingConvention.StdCall)]
public static void TestTwo() {
    MessageBox.Show("Test 2");
    Test();
    //TestThree();
}

public static void TestThree() {
    MessageBox.Show("Test 3");
}

当我从外部应用程序 (Delphi) 调用 Test 时,它工作正常,我得到消息框。
当我调用Test2 时,我在 Delphi 中得到了外部异常。立即抛出异常,它甚至没有显示消息框Test 2。 当我调用Test2,后者又调用TestThree,它不是可导出的函数,它运行正常,我得到了两个消息框Test 2Test 3

为什么我不能在我的 DLL 中调用其他导出的函数?有什么办法可以做到吗?

编辑 1:

此时我可以通过执行以下操作来实现我的需要: 创建了另一个不可导出的函数Test_Local(),将所有代码从Test 移出。现在,我不再从TestTwo 调用Test(),而是调用Test_Local(),函数Test 也调用Test_Local();

Test_Local() 尝试运行任何其他可导出函数之前一切正常。

所以在另一个可导出函数中调用可导出函数在某种程度上是不好的,它们之间有多少层不可导出函数并不重要。

【问题讨论】:

  • 我想你自己回答了这个问题。我只是建议将可导出的方法包装到一个单独的类中,并且每个方法只放置一行代码。该行将调用“实际”执行代码。这样一来,您将始终清楚哪些方法是“公开的”,并且您永远不会在常规代码中调用可导出的方法。

标签: c# dll dllexport


【解决方案1】:

我想到的一种可能性是方法的导出名称和本地名称相同。您是否尝试过更改方法的本地名称?

[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
public static void TestOne() {
    MessageBox.Show("Test 1");
}

[DllExport("Test2", CallingConvention = CallingConvention.StdCall)]
public static void TestTwo() {
    MessageBox.Show("Test 2");
    TestOne();
    //TestThree();
}

public static void TestThree() {
    MessageBox.Show("Test 3");
}

我没有测试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多