2009-04-08 2 views
8

저는 C#으로 DLL을 만들었습니다. 이제 R Environment을 사용하여 해당 DLL의 함수를 호출하고 싶습니다. R 환경에서는 관리되지 않는 C/C++ DLL을 호출 할 수 있지만 .NET DLL에는 호출 할 수 없습니다. 그래서 내 질문은, C에서 C# DLL 함수를 호출 할 수 있습니다/C++ DLL에서? 그렇다면이 작업을 수행하는 방법에 대한 정보에 대한 링크가 있습니까?C DLL에서 C# DLL을 호출 할 수 있습니까?

답변

9

가장 간단한 방법은 COM 개체로 C# DLL의 C# 클래스 중 하나를 노출 한 다음 C/C++ DLL에서 해당 인스턴스를 만드는 것입니다. 이것이 허용 가능한 옵션이 아니면 혼합 모드 C++ DLL (관리 코드와 비 관리 코드 모두 포함)를 만들어야합니다. C/C++ DLL은 혼합 모드 DLL에서 내 보낸 함수를 호출 할 수 있습니다.이 DLL은 호출을 C# 클래스로 전달할 수 있습니다.

+0

그 혼합 모드 C++ DLL은 트릭을하는 것처럼 들리지만 VS2008을 사용하는 혼합 모드 DLL 프로젝트를 만들 때 사용할 수있는 템플릿을 살펴 보았지만 하나도 보지 못했습니다. 혼합 모드 DLL을 시작하는 방법에 대해 어떻게 생각하십니까? – Guy

+0

새 C++ 클래스 라이브러리를 만드는 경우 C++ .NET DLL 프로젝트가 만들어집니다. "공용 언어 런타임 지원"설정이 "공용 언어 런타임 지원 (/ clr)"으로 설정되어있는 한 프로젝트에서 관리 코드와 관리되지 않는 코드를 자유롭게 사용할 수 있습니다. – Andy

0

실제로는 꽤 쉽습니다. NuGet을 사용하여 .Net 프로젝트에 "UnmanagedExports"패키지를 추가하기 만하면됩니다. 자세한 내용은 https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports을 참조하십시오.

그런 다음 COM 계층을 수행하지 않고 직접 내보낼 수 있습니다. 다음은 샘플 C# 코드입니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 
using RGiesecke.DllExport; 

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)] 
    public static int TestExport(int left, int right) 
    { 
     return left + right; 
    } 
} 

R은 일반 C DLL과 마찬가지로 TextExport를로드 할 수 있어야합니다.

관련 문제