2017-02-23 13 views
10

że masz następujące kodu C++:Access C++ statyczne metody z C#

extern "C" { 
    void testA(int a, float b) { 
    } 

    static void testB(int a, float b){ 
    } 
} 

Chcę uzyskać dostęp do tego w moim projekcie C# za pomocą DllImport:

class PlatformInvokeTest 
{ 
    [DllImport("test.so")] 
    public static extern void testA(int a, float b); 
    [DllImport("test.so")] 
    internal static extern void testB(int a, float b); 

    public static void Main() 
    { 
     testA(0, 1.0f); 
     testB(0, 1.0f); 
    } 
} 

To działa perfekcyjnie dla testA, ale testB kończy się niepowodzeniem wrzucania wyjątku EntryPointNotFoundException. Czy mogę uzyskać dostęp do testB z mojego kodu C#? W jaki sposób?

+6

Funkcja zadeklarowana statyczna * * w zakresie globalnym nie ma zewnętrznego powiązania więc nigdy nie może być eksportowane. Musisz usunąć statyczne. Możesz pomylić to z deklarowaniem funkcji członka klasy, stwierdzając, że statyczne robi coś zupełnie innego. –

Odpowiedz

8

static nie oznacza to samo w C++, jak w C#. W zakresie przestrzeni nazw static podaje nazwę wewnętrznego powiązania, co oznacza, że ​​jest dostępny tylko w jednostce tłumaczeniowej, która zawiera definicję. Bez statycznego ma połączenie zewnętrzne i jest dostępny w dowolnej jednostce tłumaczeniowej.

Trzeba będzie usunąć słowa kluczowego static gdy chcesz użyć DllImport