3


1

私は実際には2つの壊れていないcライブラリを持っています、それらのうちの1つは他を利用します。 どちらもかなり大きいので、書き換えることは私にとって選択肢ではありません。

私は、アンマネージコードを囲むマネージドCライブラリの作成に関するいくつかのことを読みました。 しかし、どうやって始めればいいのか、そしてこれらすべてを1つのプロジェクトにまとめる方法がわかりません。

ステップバイステップのガイドや、これをどのように行うかについての例を理解するのが簡単なことはありますか?

TIA

5 Answer


3


ATLを使ってあなたのCコード用のCOMラッパーを書くことを考えるかもしれません。 私はこれを行う方法を ブログ投稿で示しています。 これがマイクロソフトがCで書いた機能をどのようにして公開しているかです(例: Windows 7のライブラリ機能)。 COMは簡単に .NET/C# (see この投稿) このルートにたどり着いていないのであれば、 registration free COMを検討してください。あなたのラッパーを他の人と共有する必要があります。


1


実際にどの程度のライブラリ機能を公開する必要があるかにかかっていると思います。

マネージドCラッパーを作成する方法はわかりませんが、この問題を解決するために他に2つの方法を使用しました。

  1. SWIGを使用して、C#PInvokeを自動的に生成します C ++クラスのラッパー。 この種の作品ですが、*たくさん*のクラスやメンバーを公開する必要がある場合にだけ価値があります。 私の経験では、自動生成されたコードにはまだ手による調整が必要でした。

  2. 必要な機能だけのアンマネージCラッパーを作成してエクスポート それらをDLLから取得し、C#にインポートする必要があるいくつかのPInvokeラッパーを手動でコーディングします。 私はこれがいくつかのケースではより適切であるとわかりました。 さまざまな種類の画像ファイル変換を実行する大規模なC +クラスライブラリがありますが、公開したいのは、単一の関数 ` DoTheConversion(LPWSTR inputFile)+`だけです。 私のC#プログラムは、基礎となるクラスライブラリの複雑さをすべて知る必要はありませんでした。


1


管理されているCと管理されていないCを同じプロジェクトに書くことができます。 そのため、ネイティブCクラスなどを呼び出すラッパーをManaged Cで作成できます。 それからC#ではあなたの管理されたCクラスは他の.net参照のように見えるでしょう。 この場合、P / Invokeを使用する必要はありません。


1


あなたには2つの選択肢があります。1つはijwと呼ばれ、それはマネージドCを書くこととアンマネージドCと呼ぶことができるところで動作します。 他の選択肢はピンボークの使用を必要とする。

あなたがpinvokeを使うならば、あなたはこのような何かをするでしょう

C#

いくつかの機能( "str1"、 "str2"、 "str3"、 "str4");

[DllImport(@"myproj.dll", EntryPoint = "somefunction")]
public static extern IntPtr SomeFunction([MarshalAs(UnmanagedType.LPWStr)]ストリングjarg 1、[MarshalAs(UnmanagedType.LPWStr)]ストリングjarg 2、[MarshalAs(UnmanagedType.LPWStr)]ストリングjarg 3、[MarshalAs(UnmanagedType.LPWStr)]ストリングjarg 4) ;

c

extern "C" __declspec(dllexport)void * __stdcall somefunction(wchar_t * jarg1、wchar_t * jarg2、wchar_t * jarg3、wchar_t * jarg4){
//do some stuff with strings
}

あなたがSWIGを使っているなら、swigは上記のコードを自動生成しようとしますが、それは厳しいマスターです。

私は一度マネージドcを使いました、しかし、私は私がそれについて思ったことをあまり覚えていません。


0


これらの記事のいくつかを読むことは始めかもしれません - それはかなり広い主題であり、そしてそれをするための「完璧な」方法はありません:

これらのアプローチのどれもp / invokeを使用しません、そしてそれは私たちがめちゃくちゃ古いCサービスライブラリをインターフェイスする必要があるところで私が仕事をしているプロジェクトで使うアプローチです。