2010-06-16 5 views
8

CLR DLL (예 : C#으로 만든 DLL)을 비 관리 C++ 코드에서 호출 할 수 있습니까?관리되지 않는 C++에서 관리되는 DLL을 호출 할 수 있습니까?

어떻게 든 C++/CLI로 빌드 된 일부 프록시 C++ 프로세스를 통해 호출되는 것을 막을 DLL이 필요합니까?

+2

에 immediatly 사용하지 않을 경우 대리인은 당신이에 해당 관리 DLL을 래핑 할 수 고정 될 필요가있다 무엇 이건 초기에 대리자를 수집 GC, 몇 가지 트릭이있을 수 있습니다 실행 파일은 콘솔 앱이며 커맨드 라인 인자를 취하고 그 결과를'stdout'으로 내 보낸다. 그런 다음 다른 exe처럼 호출 할 수 있습니다. 이상적은 아니지만 효과가있을 수 있습니다. 이 스레드가 제대로 작동하는지 모르겠으므로 다중 스레드를 사용하지 않기를 바랍니다. –

+1

당신은 직접 대답을했습니다. C++/CLI (또는 C++. NET 또는 관리되는 C++ 또는 오늘 호출되는 방법)에 프록시를 작성한 다음 관리되지 않는 C++ 코드에서이 프록시를 호출합니다. – Patrick

+0

어쩌면이게 도움이됩니다 : http://stackoverflow.com/questions/1058897/can-c-cli-be-used-to-call-net-code-from-native-c-applications – smerlin

답변

6

CLR DLL은 COM 표시 어셈블리로 빌드해야합니다. C#을 제어 할 수 있다면 간단하게 다시 작성해야합니다. 그렇지 않으면 직접 사용하는 것이 거의 불가능합니다.

+0

@Hamish, 정교하게 신경 쓰시겠습니까? –

+0

"... 직접 사용"을 추가했습니다. 그렇지 않으면 의미가 잘못되었습니다. 미안합니다. – SWeko

+0

@SWeko : 항상 Reverse PInvoke가 있습니다. 그래서 불가능하지 않습니다. – Aamir

5

@SWeko는 원래 DLL을 수정할 수 있고 관리되지 않는 코드가 ::CoInitialize()이 호출 된 자체 스레드 또는 관리되지 않는 코드의 호출 스레드가 COM 아파트에 액세스하는 데 의존 할 수있는 경우 최상의 응답을 제공했습니다. 아파트).

그렇지 않은 경우 최상의 솔루션은 관리되는 C# 어셈블리의 래퍼로 "관리되는"C++ DLL을 만드는 것입니다. 그것은 C++/CLI라고합니다. 관리되지 않는 C API 작업을 노출하고 해당 구현 내에서 관리되는 API에 위임 할 수 있습니다. 꽤 잘 작동하며 COM API를 호출하는 것과는 달리 스레드 선호도 문제가 없습니다.

4

잘 맞는지 확실하지 않지만 아마도 "Reverse PInvoke"가 옵션입니다.

C#에서 C++로 먼저 호출 할 수있는 경우 C++에 .net 대리자를 제공하여 함수 포인터로 사용할 수 있습니다. 그런 다음 해당 함수 포인터를 사용하여 C++에서 C#으로 호출 할 수 있습니다.

public delegate int Read(int target); 
[DllImport("yourC++.dll")] 
static extern void RegisterRead(Read x); 
Read m_Read = new Read(yourClass.Read); 

RegisterRead(m_Read); 

클래스는 그냥 RegisterRead

관련 문제