.NET에서 사용할 수있는 C/C++ 객체를 작성하는 방법이 있습니까? 가장 간단한 방법, 즉 C에서 객체를 작성하고 언어 런타임에서 요구하는 인터페이스를 준수하며 언어에서 객체를 사용하는 등 모든 다른 언어를 기본적으로 확장하는 데 사용하고 싶습니다.C에서 .NET 객체 작성하기?
답변
C/C++로 라이브러리를 만들고이 메서드를 내보내고 P/Invoke을 사용하여 .NET에서 사용할 수 있습니다.
관리되는 C++를 사용하는 경우 IL 코드로 컴파일되므로 모든 .NET 언어에서 바로 사용할 수 있습니다.
관리되지 않는 C/C++ 코드의 경우 .NET 코드에서 P/Invoke를 사용하여 호출해야합니다.
C++/CLI (이전에는 Managed C++라고 불렀지 만, 그 용어는 Microsoft의 마케팅 담당자가 사용하지 않는 것으로 생각됩니다).
C++/CLI는 .NET IL로 컴파일하고 다른 .NET 언어와 상호 운용 할 수있는 기능을 제공하는 C++ 수퍼 세트입니다.
C++/CLI는 혼합 된 관리 코드와 원시 코드를 허용합니다. 이를 지원하는 유일한 .NET 언어입니다.
두 가지 방법 :
C++/CLI : C++/CLI는 일이 브리지가 가능하게 하나의 방법이다. 당신이 C++/CLI에서 CLI에 대해 만든 클래스는 기존 C++ 클래스 정확히 정기적으로하지 않습니다하지만 당신은 C++ 어댑터 패턴과 클래스를 해소 할 수
P/호출 (그 SEHExceptions을 위해 시계를!) : 사용 개발하려는 경우 기본 네이티브 C/C++ 라이브러리의 경우 P/Invoke을 사용하여 CLR에서 표준 C 내보내기에 액세스 할 수 있으며 양측에 바로 선언 할 경우 개체를 수동으로 마샬링 할 수 있습니다. 더 자세한 정보는 "Interop with Native Libraries"가이드를 참조하십시오.
나는 충분히 강조 할 수 없다. 예외 사항을 지켜보십시오! CLI 코드에서 네이티브 코드로, 네이티브 코드에서 CLI 코드로 벗어나지 마십시오.
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);
}
}
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이이를 수행해야합니다. , 그게 즐겁지 않아.
- 1. 사단파와 비슷한 방식으로 내 div 객체 작성하기
- 2. VB/C에서 Action/Func/Delegates/Lambda로 확장 메소드 작성하기
- 3. .NET 및 P2P - P2P 메신저 작성하기
- 4. .NET 불변의 객체
- 5. .NET 객체 덤프
- 6. .NET 객체 크기
- 7. .NET 캐스팅 객체
- 8. C에서 C# (.NET) API 호출
- 9. Python : copy.deepcopy로 객체 복사하기 또는 내 자신의 복사본 작성하기
- 10. obj-c에서 self.parent는 어떤 객체 유형을 반환합니까?
- 11. SWIG를 사용하여 C에서 객체 지향 API 만들기
- 12. . 활성 객체 패턴의 .NET 구현
- 13. . NET 라이브러리의 문자열 스트림 객체
- 14. 클래스 이름으로 .Net 객체 인스턴스화
- 15. 를 사용하여 .NET 객체 2008
- 16. C# .NET 동적 객체 이름
- 17. Antlr/Stringtemplates를 사용하여 번역기 작성하기
- 18. C# .Net 64K by 파일로 큰 스트림 작성하기
- 19. Objective-C에서 .NET 웹 서비스 사용 [iPhone]
- 20. 네이티브 C에서 .NET 관리 코드 호출
- 21. .Net 및 C에서 코드 성능을위한 도구 #
- 22. Clone 또는 MailMessage 불변의. NET/C에서 #
- 23. C에서 개발 된 .net webservices의 '인증되지 않은'오류
- 24. .NET/C에서 LISP 또는 SCHEME 호출하기 #
- 25. C에서 백그라운드에서 프로세스를 실행하는 방법 .net #
- 26. .net 데이터 변환 (하나의 객체 유형에서 다른 객체 유형으로) - 루핑
- 27. .NET 컬렉션 및 액세스 객체 메소드
- 28. gzip을 사용하여 .net 객체 인스턴스를 압축하는 방법
- 29. 어떤 .NET 객체 관계형 매퍼가 가장 빠릅니까?
- 30. 어떻게 F #에서 .net 객체 값을 전달합니까?
P/Invoke는 큰 바이너리 BLOB를 인수로 전달할 때 P/Invoke를 복사해야하므로 매우 비효율적입니다. 필요한 것은 구성 요소에서 .NET 인프라에 액세스하므로 복사하지 않고도 데이터에 액세스 할 수 있습니다. Managed C++는 이런 종류의 것을 제공하지만 .NET과 Mono 및 Managed C++에서 Mono와 함께 사용하는 것이 좋습니다. ( –
다른 말로하면 CLR을위한 JNI와 같은 인터페이스가 있습니까? –
If 당신이 모노로 작업하기를 원한다면, PInvoke 방식을 시도해보고 더 나은 접근법을 찾기 위해 추가 시간을 보내기 전에 성능이 허용되는지 확인하십시오. –