2

これで約1日半後、私は進歩がありませんでした.

既存のアプリケーションのプラグインとして使用される DLL を C で作成する必要があります。DLL は、Visual Studio 2008 コンパイラで次のオプションを使用してコンパイルする必要があります。

cl -DNT40 -DPOMDLL -DCRTAPI1=_cdecl -DCRTAPI2=cdecl -D_WIN32 -DWIN32 -DWIN32_LEA N_AND_MEAN -DWNT -DBYPASS_FLEX -D_INTEL=1 -DIPLIB=none -I. -I"C:\plm\2T-RAC\TcEx press53\include" -I"C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include" -c -nologo -EHsc -W1 -Ox -Oy - -MD C:\mydir\myDll.c

次に、アプリケーション ライブラリにリンクされます。

実際に何をする必要があり、問題を引き起こしているのかは、メソッドの1つでSQL Server 2008 r2からデータをプルする必要があることです。

今日見た限りでは、2005 年以前の SQL Server は CLR 言語 (C#、C++、VB.Net) と通信するように設計されているため、これを C で直接行うことはできません。

VB.Net dll とのすべてのデータベース通信を処理し、C dll 内からその関数を呼び出すことが提案されました。

アンマネージ コードからマネージ DLL を呼び出すというトピックで私が見つけたもののほとんどは、主に c++ の観点から pinvoke または com ラッパーについて話しました。

私はCOMや言及されたテクニックの経験がまったくないので、誰かが助けてくれれば大歓迎です.

4

3 に答える 3

10

これを行うには多くのオプションがありますが、すべてが簡単というわけではありません。

混合モード アセンブリ

マネージ コードを C クライアントにエクスポートする最初のより簡単な方法は、 C++/CLI を使用してコードを記述する (またはその言語を使用してラッパーを記述する) ことです。通常のアンマネージ コードで行うように、必要な C 関数をエクスポートし、その実装内で必要なマネージ関数を呼び出すだけです。ここMSDNで。

COM 相互運用

マネージド クラスを COM オブジェクトとしてエクスポートします。アンマネージ コードからは、通常の COM オブジェクトが表示されます。こちらをご覧ください。

逆 P/呼び出し

さまざまな方法でそれを行うことができます。もっと簡単なのは、視点を戻すことです。VB.NET アセンブリ ( vbnet.dll) と C ライブラリ ( purec.dll) がある場合、最初に想像できるのは、 に依存関係を追加することvbnet.dllですpurec.dll。この方法で行う場合は、COM を使用するか、アプリケーションを .NET ホストにする必要があります。より簡単な方法は元に戻すことです: (P/Invoke を使用して)purec.dllに依存関係を追加します。vbnet.dllC インターフェイスはstruct(たとえば) 関数ポインターで満たすことができる をエクスポートし、それstructを VB.NET で (デリゲートとして) 満たすと、C コードはそれらを呼び出すだけです。ここを見てください。

その他のオプション

ネイティブ ホスト: これは難しい方法です。ネイティブ アプリケーションは .NET アプリケーションをホストします。長くて複雑です。少数の関数のみをエクスポートする必要がある場合は、多すぎると思います。参照用にここに投稿します: MSDN のホスティングの概要
IPC。アプリケーションを分離したままにしておくことができ、お互いが他のアプリケーションの記述方法を無視できます。それらを接続するためのインターフェイスとチャネルを定義するだけです (名前付きパイプ、共有メモリなど、リストについてはこちらをご覧ください)。これは、VB.NET アプリケーションがサービスであるか、実行中のアプリケーションによってホストされている場合に機能しますが、実行できないいくつかの機能を単にエクスポートする場合には機能します。

于 2012-05-30T17:38:02.620 に答える
1

私がこれを解決した方法は、C dll で cmd を呼び出し、コンパイルされた VB.NET 実行可能ファイルを実行し、その出力をパイプすることでした。これは完全に理想的な解決策ではありませんでしたが、私が要求したのは単一の文字列だけだったこの状況ではうまくいきました。

于 2012-06-29T18:43:46.567 に答える
0

これがどこでも使用する既存の vb.net dll (ビジネス レイヤー) でない限り、C アプリケーションでは使用しないことをお勧めします。

C から MSSQL と通信するには、さまざまな方法があります。ネイティブ ドライバーまたは ODBC などを使用します。

于 2012-05-30T17:25:39.720 に答える