2014-09-26 22 views
5

Ich habe eine Bibliothek geschrieben, die einige Funktionen enthält, die exportiert werden. Ein Beispiel:Aufruf einer anderen Funktion, die in der Liste der exportierbaren Funktionen enthalten ist

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

Wenn ich Test von einer externen Anwendung aufrufen (Delphi) funktioniert es ok und ich bekomme das Meldungsfeld.
Wenn ich Test2 aufrufen, bekomme ich die externe Ausnahme in Delphi. Ausnahme wird sofort ausgelöst, es zeigt mir nicht einmal das Meldungsfeld Test 2. Wenn ich Test2 aufrufen, die ihrerseits ruft TestThree, die nicht exportierbare Funktion ist, läuft es ok und ich bekomme beide, Meldungsfeld Test 2 und Test 3.

Warum kann ich nicht andere exportierte Funktionen in meiner DLL aufrufen? Kann ich es irgendwie tun?

EDIT 1:

An diesem Punkt konnte ich erreichen, was ich brauche, indem Sie folgendermaßen vorgehen: von Test den gesamten Code eine andere nicht exportierbaren Funktion Test_Local(), bewegt Erstellt. Anstatt nun Test() von TestTwo Aufruf i Test_Local() nennen, Funktion Test ruft auch Test_Local();

Alles läuft ok bis Test_Local() versucht andere exportierbare Funktion auszuführen.

Es ist also irgendwie schlecht, exportierbare Funktion in einer anderen exportierbaren Funktion zu nennen, und es spielt keine Rolle, wie viele Schichten nicht exportierbarer Funktionen zwischen ihnen liegen.

+0

Ich denke, Sie haben die Frage selbst beantwortet. Ich würde nur empfehlen, die exportierbaren Methoden in eine separate Klasse zu verpacken und nur eine Zeile Code an jede von ihnen zu legen. Diese Zeile wäre ein Aufruf an den "tatsächlichen" Exekutivcode. Auf diese Weise wird immer klar, welche Methoden "exponiert" sind und dass Sie niemals exportierbare Methoden innerhalb Ihres regulären Codes aufrufen. – rocky

Antwort

0

Eine Möglichkeit, die mir einfällt, ist, dass der Exportname und der lokale Name für die Methode identisch sind. Haben Sie versucht, den lokalen Namen der Methode zu ändern?

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

Ich habe dies nicht getestet.