2009-04-17 3 views
2

이전 lib의 일부 함수를 호출하는 C++에서 작성한 함수가 있습니다. 이 함수는 메모리를 만들어 호출을 만들고 메모리를 파괴합니다. 이 최적화하려면 개체가 파괴 될 때까지 메모리를 할당 할 개체를 만들 것입니다. 그러나 C#에서이 함수를 호출 할 것이며 Class, 함수 또는 변수 만 내보낼 수 있다고 생각하지 않습니다.C#의 C++ 코드에서 객체 기능 가져 오기

제 생각은 대신이 아이디어입니다. DLL을 클래스로 생각하고 dll 범위 내에있는 local vars를 사용하여 메모리를 가리 킵니다. 그런 다음 메모리를 작성하고 작업자 함수를 호출하고 DLL을 완료하면 메모리를 손상시키는 함수를 작성하십시오.

좋은 접근 방법입니까? 더 좋은 방법이 있습니까?

+0

같은 장소에서 메모리를 만들고 파괴하고 있습니까? –

답변

2

관리되는 래퍼를 C++/CLI (이전 Managed C++)로 작성하는 편이 좋습니다. C++ 측에서 관리되는/관리되지 않는 상호 운용성으로 원하는 작업을 명시 적으로 쉽게 수행 할 수 있으므로 C#은 얻을 수 없습니다. P/Invoke 스타일 코드로 오염되었습니다.

편집 그냥 당신의 코멘트 발견 "나는 C 번호에서이 함수를 호출 할거야 그리고 난, 그냥 함수 나 변수를 클래스를 내보낼 수 있습니다 생각하지 않는다 그러나 을."

완전히 아니에요 true - C# 은 C++/CLI 코드에서 생성 된 어셈블리에서 전체 클래스를 가져올 수 있습니다.

+0

이러한 클래스는 비 관리 코드에 액세스 할 수 있습니까? – QueueHammer

+0

@ Smith325 - 예. C++/CLI는 C++의 상위 집합입니다 (C++가 C의 상위 집합이었던 것과 같은 방식으로). –

1

IDisposable을 구현하는 C# 클래스를 만듭니다. C++ 객체 주위에 간단한 C API를 래핑 할 수 있으므로 인스턴스를 생성 할 때 C++ 클래스에 대한 포인터를 반환하고 C# 클래스의 Dispose()를 호출하면 포인터를 삭제합니다.

이 포인터를 역 참조하여 C++ 클래스의 메서드를 호출 할 수 있습니다.

또 다른 좋은 대안은 C++/CLI를 사용하여 C++ 클래스의 래퍼를 만드는 것입니다. 이런 유형의 상황을 다루는 것이 훨씬 간단합니다.

+0

일부 시험에 대한 링크를 제공 할 수 있습니까? 예 : IDisposable과 함께 C 클래스에 대한 포인터 사용, C++/CLI를 사용하여 래퍼 만들기. – QueueHammer

+0

내 블로그 (http://reedcopsey.com/?p=7)에서 샘플을 얻었습니다. 모든 C++/CLI 샘플은 두 번째로 작동 할 것입니다. 네이티브 C++ 클래스 대신 C++/CLI에서 관리되는 클래스로 만들 것입니다. –

1

네이티브 C++ 코드를 변경하려는 경우 C#을 사용할 수있는 COM 인터페이스로 항상 내보낼 수 있습니다.