1. ホーム
  2. c

[解決済み] C#.NetからC言語の関数を呼び出すことは可能ですか?

2023-08-13 22:40:25

質問

C のライブラリを持っていて、C# アプリケーションからこのライブラリ内の関数を呼び出したいと思っています。私は、リンカー入力として C lib ファイルを追加し、追加の依存関係としてソース ファイルを追加して、C lib 上の C++/CLI ラッパーを作成しようとしました。

C# アプリケーションに C 出力を追加する方法がよくわからないので、これを達成するために何か良い方法がありますか。

私のCコード

__declspec(dllexport) unsigned long ConnectSession(unsigned long handle,
                            unsigned char * publicKey,
                            unsigned char   publicKeyLen);

私のCPPラッパー

long MyClass::ConnectSessionWrapper(unsigned long handle,
                                unsigned char * publicKey,
                                unsigned char   publicKeyLen)
    {
        return ConnectSession(handle, publicKey, publicKeyLen);
    }

どのように解決するのですか?

例としては Linux :

1)作成した C ファイルを作成します。 libtest.c をこのような内容で作成します。

#include <stdio.h>

void print(const char *message)
{
  printf("%s\\n", message);
}

これはprintfの単純な擬似ラッパーです。しかし、任意の C 関数を表します。もし、あなたが C++ 関数がある場合は、忘れずに extern C をつけることを忘れないでください。

2)は C# ファイル

using System;

using System.Runtime.InteropServices;

public class Tester
{
        [DllImport("libtest.so", EntryPoint="print")]

        static extern void print(string message);

        public static void Main(string[] args)
        {

                print("Hello World C# => C++");
        }
}

3) libtest.so ライブラリを "/usr/lib" のような標準的なライブラリパスに置いていない場合、System.DllNotFoundException が発生します。これを解決するには、 libtest.so を /usr/lib に移動するか、もっと良い方法は、CWD をライブラリパスに追加するだけです。 export LD_LIBRARY_PATH=pwd

クレジット ここで

EDIT

について Windows

の場合、それはあまり変わりません。 例として を例にとると、ここでは で囲むだけです。 *.cpp ファイルにメソッドを記述します。 extern "C" のようなものです。

extern "C"
{
//Note: must use __declspec(dllexport) to make (export) methods as 'public'
      __declspec(dllexport) void DoSomethingInC(unsigned short int ExampleParam, unsigned char AnotherExampleParam)
      {
            printf("You called method DoSomethingInC(), You passed in %d and %c\n\r", ExampleParam, AnotherExampleParam);
      }
}//End 'extern "C"' to prevent name mangling

で、コンパイルして、C#ファイルに

[DllImport("C_DLL_with_Csharp.dll", EntryPoint="DoSomethingInC")]

public static extern void DoSomethingInC(ushort ExampleParam, char AnotherExampleParam);

と入力し、そのまま使用します。

using System;

    using System.Runtime.InteropServices;

    public class Tester
    {
            [DllImport("C_DLL_with_Csharp.dll", EntryPoint="DoSomethingInC")]

    public static extern void DoSomethingInC(ushort ExampleParam, char AnotherExampleParam);

            public static void Main(string[] args)
            {
                    ushort var1 = 2;
                    char var2 = '';  
                    DoSomethingInC(var1, var2);
            }
    }