2

DllImport を使用して、レガシー (2012 年 2 月) C プログラムに接続する C# コードを作成しています。これは正常に動作しますが、30 を超えるさまざまな関数を呼び出す必要があり、通常は非の打ちどころのない精巧なコードを象のようなプロポーションに変えてしまいます。確かにこれを回避する方法があるはずですか?[警告: 胃腸の弱い方は、次の内容から目をそらした方がよいかもしれません]:

    [DllImport("C:\\Users\\mitt\\Documents\\Visual Studio 2010\\Projects\\mrSolution\\mr\\x64\\Debug\\mrDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern bool mrEngine_initialize(     [In, Out, MarshalAs(UnmanagedType.LPStruct)] PLOT_SPEC PlotSpec);
    [DllImport("C:\\Users\\mitt\\Documents\\Visual Studio 2010\\Projects\\mrSolution\\mr\\x64\\Debug\\mrDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern bool mrEngine_getDataPoint(   [In, Out, MarshalAs(UnmanagedType.LPStruct)] PLOT_SPEC PlotSpec);
4

3 に答える 3

2

これは、CスタイルのAPIではかなり避けられません。Windows APIは、何千もの機能を備えたものの代表的な例です。それらをハンドルで結びます。ハンドルはこれと同等のCスタイルであり、クラスオブジェクトのオブジェクト参照です。

次の段階はCOMインターフェイスで、オブジェクトモデルを構築できます。Windows APIで非常に一般的ですが、それを失ったように見えます。

ただし、これは、メソッドとプロパティが基になるCスタイルのAPIに論理的にマップされるC#クラスを使用して、独自のオブジェクトモデルを作成することを妨げるものではありません。クラスメンバーを実装し、pinvoke呼び出しを行う醜いコードは、#regionに隠すことができます。これは、二度と見る必要がないことを願っています。

この方法で行うことには、複数の利点があります。オブジェクトモデルのマッピングについて考えることは、基礎となるAPIを理解するのに本当に役立ちます。そして、あなたにたくさんのユニットテスト拡張ポイントを与えます。そして、混沌から秩序を作り出すことについて本当に気分が良くなります。

于 2012-07-07T21:25:03.100 に答える
0

プロジェクト内のdllを参照してみてください。時々それはうまくいき、VisualStudioがあなたのためにすべての配管を行います。Visual Studioが何らかの理由で文句を言う場合は、ツールTblImp.exeを使用してみてください。プロジェクトで参照できるラッパーを作成します。

于 2012-07-07T21:09:38.530 に答える
0

DllImportには、メソッドにのみ適用できるようにする制限があります。醜くなることもありますが、非常にシンプルで、その意図を真に反映しています。

今頭に浮かぶことが2つあります。

  1. 部分クラスを使用して、インポートを複数のファイルに分割します。各ファイルが小さくなり、目を傷つけることはありません。
  2. T4を使用して、インポートを含むクラスを生成し、その存在を忘れます。
于 2012-07-07T21:12:39.630 に答える