2009-10-01 2 views
1

.NET에서 사용할 수있는 C/C++ 객체를 작성하는 방법이 있습니까? 가장 간단한 방법, 즉 C에서 객체를 작성하고 언어 런타임에서 요구하는 인터페이스를 준수하며 언어에서 객체를 사용하는 등 모든 다른 언어를 기본적으로 확장하는 데 사용하고 싶습니다.C에서 .NET 객체 작성하기?

답변

0

C/C++로 라이브러리를 만들고이 메서드를 내보내고 P/Invoke을 사용하여 .NET에서 사용할 수 있습니다.

3

관리되는 C++를 사용하는 경우 IL 코드로 컴파일되므로 모든 .NET 언어에서 바로 사용할 수 있습니다.

관리되지 않는 C/C++ 코드의 경우 .NET 코드에서 P/Invoke를 사용하여 호출해야합니다.

+0

P/Invoke는 큰 바이너리 BLOB를 인수로 전달할 때 P/Invoke를 복사해야하므로 매우 비효율적입니다. 필요한 것은 구성 요소에서 .NET 인프라에 액세스하므로 복사하지 않고도 데이터에 액세스 할 수 있습니다. Managed C++는 이런 종류의 것을 제공하지만 .NET과 Mono 및 Managed C++에서 Mono와 함께 사용하는 것이 좋습니다. ( –

+0

다른 말로하면 CLR을위한 JNI와 같은 인터페이스가 있습니까? –

+1

If 당신이 모노로 작업하기를 원한다면, PInvoke 방식을 시도해보고 더 나은 접근법을 찾기 위해 추가 시간을 보내기 전에 성능이 허용되는지 확인하십시오. –

0

C++/CLI (이전에는 Managed C++라고 불렀지 만, 그 용어는 Microsoft의 마케팅 담당자가 사용하지 않는 것으로 생각됩니다).

C++/CLI는 .NET IL로 컴파일하고 다른 .NET 언어와 상호 운용 할 수있는 기능을 제공하는 C++ 수퍼 세트입니다.

C++/CLI는 혼합 된 관리 코드와 원시 코드를 허용합니다. 이를 지원하는 유일한 .NET 언어입니다.

1

P/Invoke 또는 C++/CLI가 작업에 적합하지 않은 경우 .NET에서 COM 지원을 사용할 수 있습니다.

는 여기에 대한 예제입니다 :

C++ part

C# part

그것은 MS.NET와 Mono 모두에서 작동합니다.

0

두 가지 방법 :

C++/CLI : C++/CLI는 일이 브리지가 가능하게 하나의 방법이다. 당신이 C++/CLI에서 CLI에 대해 만든 클래스는 기존 C++ 클래스 정확히 정기적으로하지 않습니다하지만 당신은 C++ 어댑터 패턴과 클래스를 해소 할 수

P/호출 (그 SEHExceptions을 위해 시계를!) : 사용 개발하려는 경우 기본 네이티브 C/C++ 라이브러리의 경우 P/Invoke을 사용하여 CLR에서 표준 C 내보내기에 액세스 할 수 있으며 양측에 바로 선언 할 경우 개체를 수동으로 마샬링 할 수 있습니다. 더 자세한 정보는 "Interop with Native Libraries"가이드를 참조하십시오.

나는 충분히 강조 할 수 없다. 예외 사항을 지켜보십시오! CLI 코드에서 네이티브 코드로, 네이티브 코드에서 CLI 코드로 벗어나지 마십시오.

0

unmanaged types (ECMA-334 §27.2)으로 작업하는 경우 (예 : 기본 유형의 배열) 다음 작업을 수행 할 수 있습니다. 이 방법으로 코드 안전성을 희생하므로 P/Invoke가 디버거 외부에서 릴리스 빌드가 느릴 경우 (디버거는 여러 가지 종류의 오류를 잡기 위해 much slower P/Invoke (100x slower)을 사용함) 첫 번째 대안을 시도하고이를 사용하는 것이 좋습니다.

[DllImport("NativeLibrary.dll")] 
private extern unsafe void NativeMethod(byte* data, int length); 

byte[] data = new byte[10000000]; 
unsafe 
{ 
    fixed (byte* ptr = data) 
    { 
     NativeMethod(ptr, data.Length); 
    } 
} 
0

Mono cannot currently compile C++/CLI, 불행하게도, C++/CLI는 아마 당신이 요구하는지 무엇을 할 수있는 가장 효율적이고 간단한 방법이지만, 아마 당신을 위해 작동하지 않을 그래서. 에 C++/CLI 어셈블리를 컴파일 할 수 있습니다.NET 도구, 아마도 but even that may not work ("내 Visual Studio .NET 프로그램을 실행할 수 있습니까?"에 대한 대답까지 스크롤하십시오.).

P/Invoke가 잠재적 인 성능 문제를 가지고 있지만 COM interop은 이전에 단순한 바닐라 C 인터페이스를 COM 인터페이스로 전환해야 함을 의미하지만 P/Invoke 또는 COM interop이이를 수행해야합니다. , 그게 즐겁지 않아.

관련 문제