관리되지 않는 코드에서 관리 코드 호출
문제
관리되지 않은 C ++에서 .NET 코드를 호출하고 싶습니다. 내 프로세스 엔트리 포인트는 .NET 기반이므로 CLR 호스팅에 대해 걱정할 필요가 없습니다. .NET 객체에 COM 포장지를 사용하여 수행 할 수 있다는 것을 알고 있지만 관리 클래스의 개별 정적 메소드에 액세스하고 싶습니다. COM은 가장 짧고 가장 쉬운 경로가 아닙니다.
감사!
해결책
/CLR로 컴파일 된 혼합 모드 어셈블리에서 실행되는 기본 C ++뿐만 아니라 실제 관리되지 않는 코드에 대해 이야기하고 있다고 가정하면 가장 쉬운 방법은 C ++ /CLI의 .NET 코드에 래퍼를 작성하는 것입니다. 그런 다음 __declspec (dllexport)로 표시하여 C ++/CLI 메소드를 내보낼 수 있습니다.
또는 관리되지 않는 코드의 호출을 제어 할 수있는 경우 기능 포인터를 .NET 메소드로 마샬링하여 관리되지 않는 코드로 전달할 수 있습니다.
다른 팁
이 솔루션을보십시오 :https://sites.google.com/site/robertgiesecke/home/uploads/unmanagedexports솔루션을 사용하면 [dllexport] 속성 (p/invoke dllimport의 반대)으로 기능을 장식하여 C에서 C# 함수를 호출 할 수 있습니다.
exmaple :
C# 코드
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
C 코드 :
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
산출:
The solution is found!!! Z is 15
업데이트: 의견에는 질문과 좋은 답변이 있습니다.
관리되지 않은 프로젝트에 DLL을 어떻게 포함합니까?
C# 코드를 컴파일 할 때 생성 된 .lib 파일에 링크해야합니다 (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&mspperror=-2147217396)
나는 당신이 리버스 핀뷰를 찾고 있다고 믿습니다. Reverse Pinvoke를 위해 Google이 있으면 많은 유용한 항목을 얻을 수 있습니다. 다음은 빠르고 더러운 예를 가지고 있다고 생각합니다.
호출 코드는 /clr을 활성화 한 C ++입니다. 오른쪽?
그렇다면 사용 명령문을 사용하여 코드에서 .NET DLL을 사용하실 수 있습니다. 같은 것 :
#using <Mydll.dll>
그런 다음 관리 클래스의 객체를 다음과 같이 간단히 만들 수 있습니다.
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
이 OBJ를 클래스의 데이터 멤버로 만들고 싶다면 GCROOT를 사용하는 방법입니다.