문제

관리되지 않은 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)

살펴보십시오 gchandle Class 및 Gcroot 키워드는 Gchandle 주변의 TypeSafe, 템플릿 래퍼를 제공합니다.

이것들을 사용하여 기본 코드에서 CLR 객체 (또는 박스형 값)에 대한 참조를 보유 할 수 있습니다.

MSDN에는 기본 자습서가 있습니다 여기.

나는 당신이 리버스 핀뷰를 찾고 있다고 믿습니다. Reverse Pinvoke를 위해 Google이 있으면 많은 유용한 항목을 얻을 수 있습니다. 다음은 빠르고 더러운 예를 가지고 있다고 생각합니다.

Pinvoke -Reverse Pinvoke 및 __stdcall -__cdecl

호출 코드는 /clr을 활성화 한 C ++입니다. 오른쪽?

그렇다면 사용 명령문을 사용하여 코드에서 .NET DLL을 사용하실 수 있습니다. 같은 것 :

#using <Mydll.dll>

그런 다음 관리 클래스의 객체를 다음과 같이 간단히 만들 수 있습니다.

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

이 OBJ를 클래스의 데이터 멤버로 만들고 싶다면 GCROOT를 사용하는 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top