【发布时间】: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 2 和Test 3。
为什么我不能在我的 DLL 中调用其他导出的函数?有什么办法可以做到吗?
编辑 1:
此时我可以通过执行以下操作来实现我的需要:
创建了另一个不可导出的函数Test_Local(),将所有代码从Test 移出。现在,我不再从TestTwo 调用Test(),而是调用Test_Local(),函数Test 也调用Test_Local();
在Test_Local() 尝试运行任何其他可导出函数之前一切正常。
所以在另一个可导出函数中调用可导出函数在某种程度上是不好的,它们之间有多少层不可导出函数并不重要。
【问题讨论】:
-
我想你自己回答了这个问题。我只是建议将可导出的方法包装到一个单独的类中,并且每个方法只放置一行代码。该行将调用“实际”执行代码。这样一来,您将始终清楚哪些方法是“公开的”,并且您永远不会在常规代码中调用可导出的方法。