2010-12-12 29 views
0

我已經通過一些在線示例將我的C++ DLL函數導入到C#中。函數必須聲明爲C#類的一部分。但是,如果我想在其他C#類中使用這些函數,我該如何共享這些聲明?如何在文件之間共享C#DllImport函數?

最好的解決方案是將C++ DLL函數導入到一般類中,並在整個應用程序中使用它。

在此先感謝。

編輯:我試了下面的建議,但現在我得到錯誤「ImportSomeStuff由於其保護級別而無法訪問」,我嘗試使用該結構。一切似乎都是公開的,那我還有什麼可以嘗試的?

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

(不同的文件)

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

回答

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

然後你可以從任何地方調用這個函數:

Native.SomeFunction(); 
+0

謝謝。我的函數也使用我在C#中聲明的結構,但是現在我得到錯誤「[class]由於其保護級別而無法訪問」,我在哪裏使用它。有什麼建議麼? – parsley72 2010-12-12 10:18:57

+0

@parsley然後使結構公開 – CodesInChaos 2010-12-12 10:25:39

+0

他們是 - 見上面的代碼示例。 – parsley72 2010-12-12 10:33:08

3

他們是靜態的功能,因此,如果你讓他們公開你應該能夠ClassName.FunctionName()訪問它們。最後這就是你如何用C函數完成的。

但通常我不會公開我的原生互操作性內容。我把它放在我的interop程序集的內部,並在它的頂部編寫一個公共包裝器,它更適合C#風格。

+0

同意。當我有更多的時間時,我想這樣做,但這只是試圖讓它工作! – parsley72 2010-12-12 10:39:13