2010-05-17 3 views
8

관리되지 않는 세계에서 __declspec (dllexport)을 작성하거나 .DEF 파일을 사용하여 함수를 노출하여 DLL을 호출 할 수있었습니다. (C++에서 __stdcall에 대해 이름을 변경하기 때문에 .DEF 파일에 별칭을 추가하여 특정 응용 프로그램에서 특정 내 보낸 DLL 함수를 다시 사용할 수있게되었습니다.) 이제는 하나의 진입 점 함수를 .NET 어셈블리를 관리되지 않는 방식으로 사용하지만 .NET 내에서 DLL 형식의 함수를 DLL에 입력해야합니다. 이것은 간단하고 직선적 인 방식으로 가능합니까?표준, 비 관리 비 .NET 응용 프로그램에서 C++/CLI (.NET) DLL을 호출하려면 어떻게합니까?

내가 가지고있는 것은 복잡한 수학을 구현하는 DLL (플러그인)을 통해 확장 한 타사 프로그램입니다. 그러나 타사 프로그램은 계산을 시각화 할 수있는 방법이 없습니다. 어떻게 든이 미리 작성된 수학 함수를 가져 와서 별도의 DLL로 컴파일 (하지만 .NET에서 C++/CLI 사용)하고 함수에 후크를 추가하여 .NET의 후드 아래에서 렌더링 할 수있게하려고합니다. 사용자 제어. .NET 작업을 관리되지 않는 작업과 혼합하거나 Google에서이 작업을 수행하는 방법을 잘 모르겠습니다.

설명 된 방식으로 렌더링을 수행하기 위해 관리되는/관리되지 않는 브리지 또는 대체 방법에 대한 구체적인 제안이 도움이 될 것입니다. 고맙습니다.

답변

4

C++/CLI를 원하십니까? 아니면 기능을 내 보내야한다고 생각하니?

후자의 경우 DllImport 작동 방식과 동일한 C#에서 관리되지 않는 내보내기를 선언 할 수있는 내 unmanaged exports을 확인하십시오.

internal class Sample 
{ 
    [DllExport("_export_test", CallingConvention.Cdecl)] 
    static int Test(int a) 
    { 
    return a + 1; 
    } 
} 
+0

내가 타사 라이브러리를 그냥/CLR 옵션을 사용하여 자동으로 컴파일 때문에 C++/CLI를 사용하고 싶었다. .NET Framework에 tie-ins을 추가하면 훨씬 더 나은 삶을 살 수있을 것입니다. 예제는 합리적인 접근 방식처럼 보입니다. 고맙습니다. – user343400

+0

나는 당신을 여기에 따라 왔는지 확신하지 못합니다. 내 프로젝트 템플릿을 가져 가면 자동으로 컴파일됩니다 (.lib 파일도 생성됩니다). 내가 당신을 오해하고 실제로 C++/CLI를 사용하고 싶을 경우를 제외하고는. –

4

글쎄, C++/CLI 컴파일러로 매우 쉽게 만들 수 있습니다. 정적 관리되는 함수를 작성하고 __declspec (dllexport)로 특성을 지정하면됩니다. 컴파일러는 자동으로 CLR을로드하여 관리 코드를 실행하는 스텁을 주입합니다.

이는 유용 할 수있는 방법이며 확장 성이 뛰어나지 않으며 속도가 매우 빠릅니다. 다음 단계는 [ComVisible (true)] 속성을 사용하여 ref 클래스를 작성하는 것입니다. Regasm.exe에 등록한 후 관리되지 않는 COM 인식 클라이언트가 해당 서버를 사용할 수 있습니다. 일반적으로 CLR 호스팅 (CorBindToRuntimeEx)은 마지막 선택이지만 가장 보편적 인 것입니다.


예제 코드 :

ref class ManagedClass { 
public: 
    static void StaticFunc() {} 
}; 

extern "C" __declspec(dllexport) 
void __stdcall UnmanagedFunc() { 
    ManagedClass::StaticFunc(); 
} 
+0

이름에 __stdcall이 필요하고 name mangling에서 @number를 없애고 .DEF 파일에서 별칭을 만들어야 할 경우이 경우 어떻게해야합니까? extern "C"스타일 서명이 필요하므로 특정 유형의 타사 응용 프로그램에서 호출 할 수 있습니다. – user343400

+0

내보내기에 extern "C"및 __stdcall 선언자를 사용하기 만하면됩니다. .def 파일이 필요 없습니다. 게시 된 샘플. –

+0

@HansPassant "컴파일러가 스텁을 주입"한다는 것은 무엇을 의미합니까? 컴파일러는 .lib을 생성합니까 (UnmanagedFunc()의 호출자가 lib와 링크해야합니까?)? – qqqqq

관련 문제