문제

.h 파일의 제 3 자 컬렉션과 함께. C ++/CLI 래퍼로 기본 C ++ 파일을 래핑하고 C#에서 최종 호출을합니다. 명시 적으로 변경하지 않는 한 랩퍼에서 값이 변경되지 않는 곳에서 참조가 전달 될 것으로 예상되는 메소드를 호출 할 때 문제가 있습니다.

내 C ++/CLI 래퍼 코드는 현재 다음과 같습니다.

bool get_testInt16(int16% testInt16)
{
   int16* t = static_cast<int16*>(GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer());
   bool b = m_NativeCMTY_TestData->get_testInt16(*t);
   testInt16 = *t;
   return b;
};

해당 기본 C ++ 코드는 다음과 같습니다.

bool get_testInt16(int16 &testInt16);

더 나은 방법이 있어야한다고 생각하지만 어쩌면 그렇지 않을까요? 더 나은 방법이 있기를 바라고 있다고하자!

도움이 되었습니까?

해결책

옵션은 다음과 같습니다.

bool get_testInt16(int16% testInt16)
{
   int16 t = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(t);
   testInt16 = t;
   return b;
};

따라서 단순히 로컬 기본 변수를 만들고 거대한 캐스트 및 .NET 포인터 물건을 피하십시오.

다른 팁

대신 고정 포인터를 사용하지 않는 이유 GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer()?

또한 이와 같이 참조 된 값을 고정시키는 것이 너무 늦습니다.

참조가 스택 값에 참조하면 불필요한 경우, 인스턴스 필드에 대한 참조라면 호출 코드는 실제로 객체를 고정시켜야합니다 (이것은 관리되지 않은 semntics를 관리 코드로 지저분한 유출이지만 최소한 동작을 만듭니다. 이 방법은 명확합니다.

Ref 매개 변수가 너무 작기 때문에 모든 고정을 완전히 피하고 스택에 임시를 만들고 관리되지 않는 함수로 전달한 다음 원본에 다시 작성하는 것이 합리적입니다.

bool get_testInt16(int16% testInt16)
{
   int16 temp = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(temp);
   testInt16 = temp;
   return b;
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top