2012-10-11 2 views
2

일부 관리 코드 (C#으로 작성)를 사용하는 C++/CLI DLL이 있습니다. DLL에서 순수한 C 함수를 내보내려고합니다. LoadLibraryGetProcAddress을 사용하여 비 관리 코드에서 호출됩니다..NET 코드를 사용하는 C++/CLI DLL에서 C 함수 내보내기

내 보낸 함수에서 인스턴스를 만들고 C# 클래스의 메서드 하나만 호출하면됩니다. 그래서 난이 시도 :

extern "C" __declspec(dllexport) int __stdcall DoWork(
     const wchar_t* Param1, 
     int Param2, 
     void* Param3) 
{ 
    WorkerNamespace::ManagedClass1 worker; 
    return worker.DoWork(gcnew String(Param1), Param2, IntPtr(Param3)); 
} 

그것은 잘 컴파일하지만 난 dumpbin CompiledDll.dll /exports을 수행 할 때 더 내 보낸 함수가 없습니다.

함수 선언 앞에 #pragma unmanaged을 추가하려고했지만 본문에서 관리되는 유형을 사용하는 데 오류가 발생했습니다.

나는 빈 스텁 (단지 return 1;)와 #pragma unmanaged와, 여전히dumpbin에 표시되지 않는 기능을 함수의 본문을 교체합니다. 그래서 내가 뭘 잘못하고 있니? C++/CLI 클래스 라이브러리 프로젝트에서 C 함수를 내보내려면 어떻게해야합니까?

답변

2

구성 문제 여야합니다. 나는 Empty project 템플릿을 사용하여 새 프로젝트를 만들어 일반 구성에 Common Language Runtime Support (/clr)

Dynamic Library (.dll)

Common Language Runtime Support

Configuration Type을 변경하고 Common PropertiesSystem.Core을 참조하고 내 C# 어셈블리를 추가하고 그것을 작동합니다.

또한 이름 변환을 처리하기 위해 .DEF 파일을 추가했습니다 (def 파일의 이름은 물론 Linker -> Input -> Module Definition file으로 설정해야 함).

LIBRARY 
EXPORTS 
DoWork 

희망은 다른 사람에게 도움이됩니다.

+0

질문에 대답하지 않습니다. 실제 구성 문제는 무엇입니까? –

+0

@HansPassant 원래 클래스 라이브러리 템플릿을 사용하여 프로젝트를 만들었습니다. 그게 내가 게시 한 것과 다른 점은 모르겠다. 그것이 공개 질문 인 이유입니다. – Alex