2012-12-20 2 views
4

C# 참조를 C/C++ 코드 (포인터)에 전달하고 포인터에서 C# 참조로 되돌려 놓습니다. 많은 쌍 (uint, Object)이 있습니다. 나는 C#보다 훨씬 빠른 C 코드로 정렬 메커니즘을 만들었습니다. 필요한 키 (uint)와 값 (객체 참조) 만 있습니다. C 코드는 정렬을 위해 키를 사용하고 값 (포인터)을 변경하지 않습니다. 그것을 할 수있는 간단한 방법이 있습니까? 마샬링을 사용해야합니까? C 함수는 여러 번 (어쩌면 백만 번) 호출 될 것이므로 너무 천천히 마샬링하는 것이 좋을지 모르겠다. 마샬링으로 어떻게 할 지조차 모른다. 개체 주소가 GC로 변경되면 C# 참조 주소가 변경되지 않습니다. 그래서 피곤한 기억 속에 물건을 놓을 필요가 없습니다. 이것에 대해 내가 맞습니까? 이제 DllImport를 사용하여 C 함수를 호출 할 수 있습니다. C 포인터에 C# 참조를 저장할 수 있지만 C 포인터에 저장된 C# 참조 주소를 가져올 수 없습니다.C# 포인터에 대한 C# 참조 전달

방법에 대한 아이디어가 있으십니까?

답변

1

Managed C# 코드에서 네이티브 C++ 코드로 직접 변수를 전달할 수 없습니다. 솔루션은 데이터를 마샬링 할 수있는 pinvoke입니다.

잘 작동하지만 매번 금식 솔루션이 아니라는 것을 알아야합니다. 모든 호출에서 메모리는 복사되어야하며 데이터 유형에 따라 변환되어야합니다.

+0

Thank's 답변을, 나는 그것을 기대했다 가능할 수 있습니다. 이제 더 C++ 프로그래밍을해야합니다. – MBI

0

비슷한 문제에 대한 해결책으로 Fortan에서 일부 오래된 코드가 있습니다. 이 코드를 c로 변환 한 다음 관리되는 C++ 프로젝트를 생성했습니다. C#에서는이 Managed C++ 프로젝트를 호출했습니다.

는 C# 코드는 다음과 같다 :

안전
{
이중 입력 * = (더블 *) utils.Memory.Alloc (는 sizeof (더블) * N);
double * output = (double *) utils.Memory.Alloc (sizeof (double) * n);
// C++ 코드 호출
c_plus_plus.code (입력, 출력); 이제 출력이 출력
// (당신이 입력 및 출력 난이 도움이되기를 바랍니다
}

와 같은 배열을 사용할 수 있습니다 포함 // .

관련 문제