4

信頼できるANSI標準Cコードがいくつかあります。つまり、ソースを持っていても、別の言語に翻訳したり、呼び出し引数を変更したりすることはできません。これらのアクションは権限を無効にするためです。150以上の機能があります。

ファイル名を .C から .CPP に変更して、Visual Studio 2009 の C++ コンパイラを使用してコンパイルできるようにするなど、付随的な変更を加えることができます。コンパイラ指令などを追加することもできます。必要に応じて、ラッパー レイヤーを通過することもできます。

もう 1 つの制限は、 C# コードでunsafeキーワードを使用することを会社が望んでいないことです。

これらの関数を C# プログラムから取得する必要があります。

典型的な C/C++ 関数は次のようになります。
double SomeFunction(double a, double[3] vec, double[3][3] mat);
配列の内容が入力される場合と出力される場合があり、両方である場合はほとんどありません。

最初にアンマネージ DLL を作成してみました (Extern C とマークされた関数を使用)。単純な引数 (int、double) のみを持つ関数は正常に機能しましたが、配列をマーシャリングする方法を特定できませんでした。(実際、いくつかのサンプル コードを見つけましたが、150 回複製するのは非常に複雑で無理でした。)

次に、同じソリューション内で 2 つのプロジェクトを試しました。1 つは C++ で、もう 1 つは C# です。C++ プロジェクトで、アンマネージとしてマークされた元の関数を呼び出すマネージ関数を作成しました。これは非常にクリーンで単純であり、単純な引数も問題なく機能しました。しかし、配列の場合、C# と C++ の境界を越えて引数の型を一致させる方法を見つけることができませんでした
Argument '2': cannot convert from 'double[]' to 'double*'
(また、前述のように、unsafe を使用してポインターを取得することはできません)。

確かに、私がやろうとしていることは可能でなければなりません。
これらの機能を取得するための最良の方法は何ですか?
(上記の関数を使用したサンプル コードは非常に優れています。)

4

3 に答える 3

4

サンプルC/C ++実装:

extern "C" __declspec(dllexport)
double SomeFunction(double a, double vec[3], double mat[3][3]) {
  double sum = a;
  for (int ix = 0; ix < 3; ++ix) {
    sum += vec[ix];
    for (int iy = 0; iy < 3; ++iy) {
      sum += mat[ix][iy];
    }
  }
  return sum;
}

サンプルC#の使用法:

private void Form1_Load(object sender, EventArgs e) {
  double[] vec = new double[3];
  double[,] mat = new double[3, 3];
  for (int ix = 0; ix < 3; ++ix) {
    vec[ix] = ix;
    for (int iy = 0; iy < 3; ++iy) {
      mat[ix, iy] = (ix + 1) * iy;
    }
  }
  double sum = SomeFunction(1, vec, mat);
}
[System.Runtime.InteropServices.DllImport("cpptemp8.dll")]
private static extern double SomeFunction(double a, double[] vec, double[,] mat);
于 2009-03-03T02:49:58.620 に答える
1

externおよびP/Invokeソリューションを機能させることができない場合は、ラッパーがおそらく最善の策です。マネージコードとアンマネージコードの両方を使用するマネージC++DLLを作成します。このDLLに.NETクラスを追加します。これは、CDLLの関数の単なる薄いラッパーです。C#コードはC ++ .NETクラスを呼び出すことができ、C++.NETクラスはC関数を転送します。

このようにして、ランタイムに依存せずに、.NETとアンマネージコード間の変換を自分で作成できます。

于 2009-03-02T23:24:13.593 に答える
0

swigを使用すると、ピンボークが生成されます

于 2009-03-04T17:21:02.917 に答える