[解決済み] C#.NetからC言語の関数を呼び出すことは可能ですか?
質問
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);
}
}
関連
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
関数 'malloc' の暗黙の宣言に対する解決策
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] mallocで文字列を確保する
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?