2010-12-28 4 views
2

레거시 관리되는 C++ dll이 있는데 관리되는 유형을 반환하는 일부 함수를 호출해야합니다.dll에서 clr 매개 변수가있는 내보내기 함수?

관리되는 형식이없는 dllexports를 들어

,이 쉽고, 난 그냥 이런 헤더에 내 정적 C (++) 함수를 정의 :

extern "C" 
{ 
    __declspec(dllexport) int __cdecl InitSystem(); 
} 

하지만 지금은 정적 C는 (++) 함수는 반환해야 여기에는 문제가 있습니다. I (예를 들어)하려고하면 :

extern "C" 
{ 
    __declspec(dllexport) System::Collections::Generic::List<System::String^>^ __cdecl InitSystem(); 
} 

을 나는 컴파일러 오류를 (함수 정의의 요구가 서명을 __clrcall) 얻을.

DLL이 어셈블리가 아니기 때문에 (.) 생각합니다. 저는 .net/clr 매개 변수를 사용하여 간단한 함수 호출을 내보내는 방법에 약간의 손실이 있습니다. 이것은 아마 간단하고 나는 다만 틀린 방향에서보고있다?

답변

2

어셈블리가되어야합니다. 관리되는 유형의 코드를 빌드하는 다른 방법은 없습니다. 관리되는 코드와 원시 코드를 하나의 어셈블리로 혼합하면 좋습니다. 자동으로 문제를 해결하면 기능을 메타 데이터에서 사용할 수 있으므로 내보낼 필요가 없습니다. 모든 데코레이션을 삭제해야하며 관리되는 방법에 적용 할 수 없습니다. 다른 관리되는 언어에서도 사용할 수 있도록 ref 클래스에 있어야합니다.

public ref class Mumble { 
public: 
    static System::Collections::Generic::List<System::String^>^ InitSystem(); 
}; 

이제 C# 프로그램에서 var lst = Mumble.InitSystem()을 사용할 수 있습니다. 네임 스페이스를 사용하는 것이 좋습니다.

/clr btw 조심해, 불평없이 IL에 네이티브 코드를 쉽게 변환 할 것입니다. 소스 코드 파일에서/clr을 해제하거나 #pragma managed를 사용하십시오.