0

C# でアンマネージ DLL を使用するコントローラーと通信する必要があります。ドキュメントは DLL にはあまり役に立たず、私は DLL と対話した経験がありません。同社は、VB から DLL をラップするクラスを含むサンプル VB プロジェクトを提供しています。このクラスは ctccom32v2 と呼ばれます。

アンマネージ DLL を呼び出すという汚い作業は、構造体やその他の変数を含めて既に行われているため、そのクラスを使用して VB クラス ライブラリを作成できると考えました。時間と労力を大幅に節約できると思います。そこで、そのクラス ソース ファイルを VB クラス ライブラリ プロジェクトに追加すると、ビルド時に dll が吐き出されました。次に、その dll を C# プロジェクトの参照に追加すると、参照ブラウザーで関数を確認できます。私が作成したライブラリの名前は CTC_Lib です。

(なぜ私が自分のプログラムを VB で記述せず、そのクラスを使用しないのか疑問に思われている場合は、C# での作業を好み、より快適に作業できます)

私が直面している問題は次のとおりです。次を使用してライブラリのインスタンスを作成すると

CTC_Lib.Ctccom32v2 ctc = new CTC_Lib.Ctccom32v2();

次に ctc.somefunction と入力しようとすると、intellisense は Equals、GetHashCode などのいくつかの既定のメソッドを表示します。アンマネージ DLL を公開する Ctccom32v2 関数は見当たりません。

ライブラリとクラス名を次のように手動で入力すると:

CTC_Lib.Ctccom32v2.

Ctccom32v2 のすべての関数を含む IntelliSense リストがポップアップ表示されます。

別のクラスを VB クラス ライブラリ (「somelib」と呼びましょう) に追加し、それに単純な関数を貼り付けると、次のようになります。

Public Function add() as Void
Return 1+2;
End Function

次に、同じ方法でインスタンスを作成します。

CTC_Lib.somelib ctc = new CTC_Lib.somelib();

ctc と入力するだけで、関数 "add" が IntelliSense ウィンドウに表示されるようになりました。

関数が VB クラスで宣言される方法が原因でしょうか? これは VB クラスの多くの関数の 1 つです。それらはすべて「Declare Auto Function」を使用して同じように宣言されています。

Declare Auto Function CtOpenConnection Lib "Ctccom32v2.dll" _
    (ByVal ConnectID As Integer, ByVal CommPort As Integer, ByVal Address As Integer) As Integer

Auto 関数の意味はわかりませんが、関数が存在するクラスのインスタンスを作成しようとすると、関数が公開されません。

これが VB クラス ライブラリ内でこれらの関数を呼び出す適切な方法である場合、またはそうでない場合は、私に知らせてください。私は初心者です。また、用語の一部が間違っている場合はご容赦ください。私はプログラミングの専門用語が (まだ) 得意ではありません。

4

2 に答える 2

1

アンマネージ DLL には、関数に関する情報を正しく表示するために必要なメタデータがないため、2 つのシナリオで IntelliSense が異なります。あなたのVB関数そのメタデータを持っています。

回避策は既に知っています。ライブラリとクラス名を手動で入力します。または、マネージ VB メソッドでアンマネージ関数をラップすることもできます。これにより、インテリセンシングに必要なメタデータが提供されます。

于 2012-06-28T16:50:06.910 に答える
0

DeclareステートメントのMSDNドキュメントを参照してください。externこれは、C#でメソッドを宣言するのと似ています。足りないのはアクセス修飾子だと思います。Public Declare ...宣言された場所の外で使用できるようにする必要があります。

Public Shared Functionそれが問題ではなかった場合は、を使用して、パブリッククラスでとして宣言することをお勧めしますDllImport。その例は、Declareステートメントのドキュメントの下部に示されています。

また、おそらくこれのために、そして一般的なC#/ VB変換のために、ILSpyでアセンブリを逆コンパイルし、これらの行によって何が生成されるかを確認することも役立ちます。

于 2012-06-28T16:50:46.210 に答える