2010-12-12 6 views
0

Ich habe meine C++ DLL-Funktionen in C# importiert, indem Sie einige Online-Beispiele folgen. Die Funktionen müssen als Teil einer C# -Klasse deklariert werden. Aber wenn ich diese Funktionen in anderen C# -Klassen verwenden möchte, wie kann ich die Deklarationen teilen?Wie kann ich C# DllImport Funktionen zwischen Dateien teilen?

Die beste Lösung wäre, die C++ - DLL-Funktionen in eine allgemeine Klasse zu importieren und diese in meiner gesamten Anwendung zu verwenden.

Vielen Dank im Voraus.

Edit: Ich habe den Vorschlag unten versucht, aber jetzt bekomme ich den Fehler "ImportSomeStuff ist aufgrund seiner Schutzstufe nicht zugänglich", wo ich versuche, die Struktur zu verwenden. Alles scheint öffentlich zu sein. Was kann ich sonst noch versuchen?

class ImportSomeStuff 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MyStruct 
    { 
     public uint nData; 
    } 

    public delegate void MyCallback(ref MyStruct myStruct); 

    [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    public static extern bool AddCallback(MyCallback callback); 

    [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    public static extern bool RemoveCallback(MyCallback callback); 
} 

(andere Datei)

class DoSomeStuff 
{ 
    public List<ImportSomeStuff.MyStruct> listStuff = new List<ImportSomeStuff.MyStruct>(); 
} 

Antwort

3
public static class Native 
{ 
    [DllImport("nativelib.dll")] 
    public static extern int SomeFunction(); 
} 

Und dann könnte man diese Funktion aufrufen von überall her:

Native.SomeFunction(); 
+0

Danke. Meine Funktionen verwenden auch eine Struktur, die ich in C# deklariert habe, aber ich bekomme jetzt den Fehler "[Klasse] ist aufgrund ihrer Schutzstufe nicht zugänglich", wo ich sie verwende. Irgendwelche Vorschläge? – parsley72

+0

@parsley dann die Strukturen öffentlich machen – CodesInChaos

+0

Sie sind - siehe Codebeispiel oben. – parsley72

3

Sie sind statische Funktionen, so dass, wenn man sie öffentlich machen sollten Sie in der Lage sein, auf sie zuzugreifen mit ClassName.FunctionName(). Endlich geht es so mit C-Funktionen.

Aber normalerweise mache ich meine nativen Interop-Sachen nicht öffentlich. Ich behalte es intern in meiner Interop-Assembly und schreibe einen öffentlichen Wrapper darauf, der besser zu C# passt.

+0

Einverstanden. Ich möchte das tun, wenn ich mehr Zeit habe, aber ich versuche nur, es zum Laufen zu bringen! – parsley72

Verwandte Themen