CLR DLL (예 : C#으로 만든 DLL)을 비 관리 C++ 코드에서 호출 할 수 있습니까?관리되지 않는 C++에서 관리되는 DLL을 호출 할 수 있습니까?
어떻게 든 C++/CLI로 빌드 된 일부 프록시 C++ 프로세스를 통해 호출되는 것을 막을 DLL이 필요합니까?
CLR DLL (예 : C#으로 만든 DLL)을 비 관리 C++ 코드에서 호출 할 수 있습니까?관리되지 않는 C++에서 관리되는 DLL을 호출 할 수 있습니까?
어떻게 든 C++/CLI로 빌드 된 일부 프록시 C++ 프로세스를 통해 호출되는 것을 막을 DLL이 필요합니까?
@SWeko는 원래 DLL을 수정할 수 있고 관리되지 않는 코드가 ::CoInitialize()
이 호출 된 자체 스레드 또는 관리되지 않는 코드의 호출 스레드가 COM 아파트에 액세스하는 데 의존 할 수있는 경우 최상의 응답을 제공했습니다. 아파트).
그렇지 않은 경우 최상의 솔루션은 관리되는 C# 어셈블리의 래퍼로 "관리되는"C++ DLL을 만드는 것입니다. 그것은 C++/CLI라고합니다. 관리되지 않는 C API 작업을 노출하고 해당 구현 내에서 관리되는 API에 위임 할 수 있습니다. 꽤 잘 작동하며 COM API를 호출하는 것과는 달리 스레드 선호도 문제가 없습니다.
잘 맞는지 확실하지 않지만 아마도 "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
에 immediatly 사용하지 않을 경우 대리인은 당신이에 해당 관리 DLL을 래핑 할 수 고정 될 필요가있다 무엇 이건 초기에 대리자를 수집 GC, 몇 가지 트릭이있을 수 있습니다 실행 파일은 콘솔 앱이며 커맨드 라인 인자를 취하고 그 결과를'stdout'으로 내 보낸다. 그런 다음 다른 exe처럼 호출 할 수 있습니다. 이상적은 아니지만 효과가있을 수 있습니다. 이 스레드가 제대로 작동하는지 모르겠으므로 다중 스레드를 사용하지 않기를 바랍니다. –
당신은 직접 대답을했습니다. C++/CLI (또는 C++. NET 또는 관리되는 C++ 또는 오늘 호출되는 방법)에 프록시를 작성한 다음 관리되지 않는 C++ 코드에서이 프록시를 호출합니다. – Patrick
어쩌면이게 도움이됩니다 : http://stackoverflow.com/questions/1058897/can-c-cli-be-used-to-call-net-code-from-native-c-applications – smerlin