Napisałem bibliotekę, która ma pewne funkcje, które są eksportowane. Przykład:Wywołanie innej funkcji znajdującej się na liście funkcji eksportowanych
[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");
}
gdy zgłoszę Test
z zewnętrznej aplikacji (Delphi) to działa OK i pojawia się okno komunikatu.
Po wywołaniu Test2
, otrzymuję wyjątek External w Delphi. Wyjątek jest odrzucany od razu, nie pokazuje mi nawet okna komunikatu: Test 2
. Gdy zadzwonię pod numer Test2
, który z kolei wywołuje TestThree
, który nie jest funkcją eksportu, działa poprawnie i otrzymuję oba komunikaty: komunikat Test 2
i Test 3
.
Dlaczego nie mogę wywołać innych eksportowanych funkcji wewnątrz mojej biblioteki DLL? Czy jest jakiś sposób, abym mógł to zrobić?
EDIT 1:
W tym momencie mogę osiągnąć to, co muszę, wykonując następujące czynności: Utworzony inny niż wywóz funkcję Test_Local()
przeniósł cały kod z Test
. Teraz zamiast dzwonić Test()
z TestTwo
zgłoszę Test_Local()
, funkcja Test
wzywa również Test_Local();
Wszystko działa ok, dopóki Test_Local()
próbuje uruchomić dowolną inną funkcję wywóz.
Tak więc źle jest wywołać funkcję eksportową wewnątrz innej funkcji eksportu i nie ma znaczenia, ile warstw funkcji niesportowych jest między nimi.
Myślę, że sam odpowiedziałeś na to pytanie. Chciałbym tylko polecić owijanie metod eksportowania do oddzielnej klasy i wstawiać tylko jeden wiersz kodu do każdego z nich. Linia ta byłaby wezwaniem do "faktycznego" kodu wykonawczego. W ten sposób zawsze będzie jasne, które metody są "narażone" i że nigdy nie wywołujesz metod eksportowania w ramach zwykłego kodu. – rocky