2009-11-13 4 views
3

DLL에 전달할 배열 배열이 있습니다. "중첩 배열에 대한 마샬링 지원이 없습니다."라는 오류가 발생합니다.C#에서 배열 배열을 DLL에 전달하는 안전한 방법은 무엇입니까?

하나의 배열을 잘 전달할 수 있지만 스택하면 실패합니다. 배열의 배열을 전달하는 "안전한"방법이 필요합니다.

편집 : 마샬링과 관련된 솔루션을 수용하기에 충분한 낙담과 고뇌로 기꺼이합니다.

답변

1

두 배 배열을 단일 배열로 변환 (즉, 병합) 할 수 있습니다. 이는 폭과 높이 변수를 유지하고, 같은 인덱스를 액세스하여 수행 할 수

string atXY = someStringsInSingleArray[(y * width) + x]; 

배열은 다음과 같이 변환 될 수있다 : I는 것처럼하지 않을 어떤 우연히 발견

string * array = new string[width * height]; 

for (unsigned int y = 0; y < height; ++y) 
{ 
    for (unsigned int x = 0; x < width; ++x) 
    { 
     array[(y * width) + x] = someStringsInGroups[x][y]; 
    } 
} 

// (pass single array to dll) 

delete [] array; 
+0

그 아이디어를 일반화하기 위해 2D 배열을 1D 배열 또는 문자열과 같은 직렬화 가능한 형식으로 배치 할 수 있습니다. –

+0

전에 int 배열에서 일부 데이터를 직렬화하고 심지어 C++ 측에서 일부 스트럿 캐스팅을 수행하여 데이터를 할당 할 수 있습니다 (o [i] .value v.s. o [i] [7]). 문자열이 DLL에 전달되면 문자열은 끝에있는 Null로 마샬링됩니다. 만약 내가 그것을 직렬화한다면, 나는 그것들을 추가해야 할 것이다. 큰 문제는 아니지만, 그 코드는 나를 둘러싼 기술자들을 괴롭 히게한다. 다른 요구 사항은 모든 코드가 C#에서 "안전"해야한다는 것입니다. 또 다른 해결책은 실제로 데이터를 군대로 공격하는 것입니다. – QueueHammer

0

안전하지만 포인터 만 할당되기 때문에 훨씬 빠릅니다.

http://www.mycsharp.de/wbb2/thread.php?threadid=82380

그것은 독일어로하지만 페이지의 끝 부분에있는 코드를 복사/붙여 넣기 준비가 된 것입니다. 필자의 경우에는 클래스를 generic으로 두 배로 지원할 수있게 만들었습니다.

문자열 [] []에 대해 모르겠다. char *에 마샬링 될 문자열을 가정하므로, 예제에서와 같이 [] [] *를 char [] [] * 대신 사용할 수 있습니다. .

관련 문제