문제

권위있는 ANSI 표준 C 코드가 있습니다. 그 의미는 소스가 있지만 다른 언어로 번역하거나 호출 인수를 수정할 수는 없다는 것입니다. 그러한 행동은 권위를 무효화 할 수 있기 때문입니다. 150 개가 넘는 기능이 있습니다.

파일 이름을 .c에서 .cpp로 변경하여 Visual Studio 2009의 C ++ 컴파일러를 사용하여 컴파일 할 수있는 부수적 인 변경을 수행 할 수 있습니다. 컴파일러 지침 등도 추가 할 수 있습니다. 필요한 경우 래퍼 레이어를 통과 할 수도 있습니다.

또 다른 제한은 우리 회사가하는 것입니다 ~ 아니다 내가 사용하기를 원합니다 위험한 모든 C# 코드의 핵심 단어.

C# 프로그램에서 이러한 기능을 수행해야합니다.

일반적인 C/C ++ 기능은 다음과 같습니다.
double SomeFunction(double a, double[3] vec, double[3][3] mat);
배열 내용이 입력되는 경우, 때로는 출력 및 거의 둘 다 거의 없습니다.

먼저 관리되지 않는 DLL을 만들려고 시도했습니다 (기능이 외부 C로 표시됨). 간단한 인수 (int, double) 만있는 기능은 잘 작동했지만 배열을 마샬링하는 방법을 결정할 수 없었습니다. (실제로, 나는 샘플 코드를 찾았지만 150 번 복제하는 것은 매우 복잡하고 불합리했습니다.)

그런 다음 동일한 솔루션 내에서 하나는 C ++에서, 다른 하나는 C#에 두 개의 프로젝트를 시도했습니다. C ++ 프로젝트에서, 나는 관리되지 않은 것으로 표시된 원래 함수라고하는 관리 기능을 만들었습니다. 이것은 매우 깨끗하고 단순했으며 다시 한 번 간단한 주장이 잘 작동했습니다. 그러나 배열의 경우 인수 유형을 C#에서 C ++ 경계까지 일치시키는 방법을 찾을 수 없었습니다.
인수 '2': 'double []'에서 'double*'으로 변환 할 수 없습니다.
(위에서 언급했듯이, 나는 안전하지 않아 포인터를 얻을 수 없습니다).

확실히 내가하려는 것은 가능해야합니다.
이 기능을 얻는 가장 좋은 방법은 무엇입니까?
(위의 기능을 사용한 샘플 코드는 정말 멋질 것입니다.)

도움이 되었습니까?

해결책

샘플 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);

다른 팁

외부 및 P/호출 솔루션을 얻을 수 없다면 래퍼가 가장 좋은 방법 일 것입니다. 관리되는 코드 및 관리되지 않는 코드를 모두 사용하는 관리되는 C ++ DLL을 만듭니다. 이 DLL에 .NET 클래스를 추가하십시오.이 DLL은 C DLL의 함수보다 얇은 랩퍼입니다. C# 코드는 C ++ .NET 클래스를 호출하여 C 함수를 전달할 수 있습니다.

이렇게하면 런타임에 의존하는 대신 .NET과 관리되지 않는 코드 사이의 번역을 직접 작성할 수 있습니다.

Swig를 사용하면 Pinvoke가 생성됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top