2014-09-26 15 views
5

Ho scritto una libreria con alcune funzioni che vengono esportate. Un esempio:Chiamare un'altra funzione che si trova nell'elenco delle funzioni esportabili

[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"); 
} 

quando chiamo Test da un'applicazione esterna (Delphi) funziona bene e ottengo la finestra di messaggio.
Quando chiamo Test2, ottengo l'eccezione esterna in Delphi. L'eccezione viene lanciata subito, non mi mostra nemmeno la casella di messaggio Test 2. Quando chiamo Test2 che a sua volta chiama TestThree, che non è funzione esportabile, funziona correttamente e ottengo entrambi, casella di messaggio Test 2 e Test 3.

Perché non posso chiamare altre funzioni esportate nella DLL? C'è un modo in cui posso farlo?

EDIT 1:

A questo punto ho potuto ottenere quello che mi serve nel modo seguente: Creato un'altra funzione non esportabile Test_Local(), spostato tutto il codice da Test. Ora, invece di chiamare Test() da TestTwo io chiamo Test_Local(), funzione Test chiede anche Test_Local();

Tutto funziona bene fino a quando Test_Local() tenta di eseguire qualsiasi altra funzione esportabile.

Quindi è in qualche modo brutto chiamare funzione esportabile all'interno di un'altra funzione esportabile e non importa quanti strati di funzioni non esportabili ci siano tra di loro.

+0

Penso che tu abbia risposto tu stesso alla domanda. Vorrei solo raccomandare di avvolgere i metodi esportabili in una classe separata e solo mettere una riga di codice per ognuno di essi. Quella linea sarebbe una chiamata al codice esecutivo "effettivo". In questo modo sarà sempre chiaro quali metodi sono "esposti" e che non chiami mai metodi esportabili all'interno del tuo normale codice. – rocky

risposta

0

Una possibilità che mi viene in mente è che il nome di esportazione e il nome locale per il metodo sono gli stessi. Hai provato a cambiare il nome locale del metodo?

[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"); 
} 

Non l'ho ancora provato.

Problemi correlati