2010-01-17 6 views
15

어떻게 C# 메서드를 내보낼 수 있습니까?C# 메소드를 내보내는 방법은 무엇입니까?

나는 DLL이있어서 ctypes 모듈로 파이썬 언어로 그 메소드를 사용하고 싶다. ctypes 모듈을 사용해야하기 때문에 파이썬에서 볼 수 있도록 C# 메서드를 내 보내야합니다.

그렇다면 C# 메소드를 어떻게 C++에서 내보내는 것처럼 내보낼 수 있습니까?

+1

IronPython을 사용하지 않는 이유는 무엇입니까? –

+0

교수님의 "주문" –

+0

python.net은 아래에 언급 된 Python C-API 및 .NET Pinvoke 및 관리되지 않는 내보내기를 사용하여 Python과 .NET 사이의 양방향 interop을 허용합니다. 그래서 모든 단단한 조각들이 당신을 위해 쓰여졌습니다! http://pythonnet.github.io/ – denfromufa

답변

22

인기있는 믿음과 달리이 입니다.
here을 참조하십시오.

+1

dllexp.exe를 사용하여 템플릿이 생성 한 C# dll에서 내 보낸 메소드를 볼 수 있었고 메서드가 발생하지 않았습니다. dllexp.exe와 같은 프로그램에서 외부에서 C# dll 메서드를 볼 수있는 방법이 있습니까? ? –

+0

답변을위한 tks;) –

1

정상적인 Python 구현 ("CPython")을 사용하면 적어도 직접적으로는 할 수 없습니다.

C++/CLI을 사용하여 C# 메서드 주위에 네이티브 C 래퍼를 작성하고 Python에서 이러한 래퍼를 호출 할 수 있습니다.

또는 IronPython을 시도 할 수 있습니다. 이를 통해 Python 코드와 C#을 포함한 .Net 언어로 된 코드를 실행할 수 있습니다.

+1

IronPython과 같은 추가 구현이 아니라 Python 자체를 사용하고 싶습니다. –

1

(이것은 더 이상 SLaks 이후 관련하지 않을 수는 독창적 인 링크를 발견했다,하지만 난 ... 참조 용으로 편집 된 버전을 떠날거야)

에 .NET/C#을 개체 노출의 "정상적인"방법 관리되지 않는 코드 (예 : Python)는 C# DLL (.NET 어셈블리)에 대한 COM 호출 가능 래퍼를 만들고 파이썬의 COM/OLE 지원을 사용하여이를 호출하는 것입니다. COM 호출 가능 래퍼를 만들려면 tlbexp 및/또는 regasm 명령 줄 유틸리티를 사용하십시오.

그러나 이것은 SLaks 링크가 수행하는 C/DLL 스타일 API를 제공하지 않습니다.

+1

사실, 가능합니다. 내 대답을 보라. – SLaks

1

그건 불가능합니다. DLL 내보내기가 필요하면 C++/CLI 언어를 사용해야합니다. 예 :

public ref class Class1 { 
public: 
    static int add(int a, int b) { 
     return a + b; 
    } 
}; 

extern "C" __declspec(dllexport) 
int add(int a, int b) { 
    return Class1::add(a, b); 
} 

클래스는 C#으로도 작성할 수 있습니다. C++/CLI 컴파일러는 CLR이로드되고 실행이 관리 모드로 전환되도록하는 특수 내보내기 기능을 제공합니다. 이것은 정확하게 빠르지는 않습니다.

C#에서 [ComVisible (true)] 코드를 쓰는 것도 가능합니다.

+1

사실, 가능합니다. 내 대답을 보라. – SLaks

+1

Meh, 기사도 다운로드 할 수있는 소스 코드도 어떻게 작동하는지 설명하지 않습니다. 나는 OP로부터의 확인을 기다릴 것이다. –

+0

ctypes 모듈을 제대로 사용하려면 래퍼 C++ dll (C# dll)을 빌드해야했습니다! –

관련 문제