2010-12-12 13 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#で宣言した構造体も使用していますが、私は現在、 "[クラス]がその保護レベルのためにアクセスできない"というエラーを受けています。助言がありますか? – parsley72

+0

@parsley次にstructsを公開します – CodesInChaos

+0

これは上記のコード例を参照してください。 – parsley72

3

彼らは静的関数なので、あなたがそれらを公開する場合は、ClassName.FunctionName()でそれらにアクセスすることができるはずです。最後に、C関数を使用してそれを行う方法です。

しかし、通常、私のネイティブinteropのものを公開することはありません。私はそれを私のinteropアセンブリで内部的に保ち、その上にC#スタイルに適したパブリックラッパーを作成します。

+0

は、合意されました。私はもっ​​と時間があるときにそれをしたいと思っていますが、これはうまく動作しようとしています! – parsley72

関連する問題