문제

관리되지 않은 C ++에서 C# 라이브러리 구현을 호출하기위한 옵션을 이해하려고합니다.

내 최상위 모듈은 관리되지 않는 C ++ COM/ATL DLL입니다. 기존 관리 된 C# DLL의 기능을 통합하고 싶습니다. 나는 두 라이브러리의 소스를 다시 컴파일 할 수 있습니다.

나는 같은 기사를 읽는 것을 이해합니다 이 개요 MSDN에서 이렇게 질문 기본 C ++ 코드가 C# 라이브러리로 호출 할 수있는 "혼합 모드"DLL을 만들 수 있습니다.

이 접근법에 대한 몇 가지 질문이 있습니다.

  1. 이것을 설정하려면 어떻게해야합니까? C# 모듈을 사용할 수 있도록 기존 COM/ATL 프로젝트의 일부 속성을 간단히 변경할 수 있습니까?
  2. 이 혼합 모드 호출은 COM Interop 통화와 성능이 어떻게 다릅니 까? 모듈 사이의 변환 또는 깊은 사본을 방지하는 데 사용할 수있는 공통 문자열 형식이 있습니까?
  3. 이 DLL이 혼합 모드를 만들면 COM 클라이언트가 동일한 방식으로 인터페이스/사용 할 수 있습니까? 아니면 혼합 모드 인식이 필요합니까?
  4. 이 COM 객체를로드 할 때 CLR을 포함하면 상당한 오버 헤드가 부과됩니까?

나는 Windows Development를 처음 접 했으므로 질문 명령문에 설명이 필요하다면 의견을 제시하십시오.

미리 감사드립니다.

도움이 되었습니까?

해결책

이것을 설정하려면 어떻게해야합니까? C# 모듈을 사용할 수 있도록 기존 COM/ATL 프로젝트의 일부 속성을 간단히 변경할 수 있습니까?

해당 프로젝트를 완전히 제어한다면 그러한 설정을 변경하는 것이 문제가되지 않습니다. 당신이 필요한 것은 가능합니다 /clr 이 프로젝트의 경우 (프로젝트 속성에서, "일반"페이지를 열고 "공통 언어 런타임"지원을 찾으십시오). 이제 관리 된 핸들을 사용할 수 있습니다 (^필요에 따라 프로젝트에서 다른 C ++/CLI 비트. 일반 C ++로 작성된 모든 기존 코드는 계속 작동해야합니다 (가능한 한 지금까지 MSIL에 컴파일 될 것이지만 의미론은 변경되지 않습니다).

이 혼합 모드 호출은 COM Interop 통화와 성능이 어떻게 다릅니 까? 모듈 사이의 변환 또는 깊은 사본을 방지하는 데 사용할 수있는 공통 문자열 형식이 있습니까?

혼합 모드 호출은 더 빠른 통화 규칙을 사용하고 COM Interop과 같은 방식으로 마샬링하지 않기 때문에 더 빠릅니다 (본질적으로 호환되는 유형을 사용하거나 명시 적 변환을 수행합니다).

공통 문자열 형식이 없습니다 - 문제는 System::String 둘 다 버퍼를 할당하고 소유하며, 또한 불변이 필요합니다. 그래서 당신은 버퍼를 직접 만들 수없고 그것을 String, 또는 a String 그런 다음 텍스트를 출력하는 버퍼로 사용하십시오.

이 DLL이 혼합 모드를 만들면 COM 클라이언트가 동일한 방식으로 인터페이스/사용 할 수 있습니까? 아니면 혼합 모드 인식이 필요합니까?

동일하게 인터페이스 할 수 있지만 기본 진입 점을 통해 입력하면 이미로드되지 않은 한 CLR을 프로세스에로드하려고합니다. 통화 클라이언트가 통화 전에 이미 CLR을로드 한 경우 (또는 클라이언트가 관리 코드에서 호출 된 경우) 이미로드 된 CLR을 얻을 수 있습니다. 이는 코드가 요구하는 CLR과 다를 수 있습니다 (예 : 클라이언트 1.1을로드했을 수 있으며 코드에는 2.0이 필요합니다).

이 COM 객체를로드 할 때 CLR을 포함하면 상당한 오버 헤드가 부과됩니까?

오버 헤드로 정의하는 것에 따라 다릅니다. 코드 크기? 런타임 처벌? 메모리 발자국?

어쨌든 CLR을로드하면 모든 GC 및 JIT 기계를 얻을 수 있습니다. 저렴하지 않습니다. 즉, 관리 코드에 전화해야한다면 궁극적으로 어쨌든이 문제는 없습니다. 가지다 이 작업을 수행하기 위해 CLR을 일부 프로세스에로드합니다. COM Interop과 Mixed-Mode C ++/CLI 어셈블리 간에는 처벌이 다르지 않습니다.

다른 팁

이 접근법을 적극적으로 사용하지 않았기 때문에 문자열 문제와 같은 세부 사항에 대해 많이 말할 수 없습니다.

그러나 VS 마법사가 프록시를 만들도록하여 C# 코드에서 COM 인터페이스를 쉽게 소비 할 수 있습니다. COM 및 .NET을 호출 할 때 항상 보유한 성능 오버 헤드가 없습니다.

다른 방향은 C# 어셈블리를 설정하면됩니다. ComVisibleAttribute true (vs에서 프로젝트 속성의 간단한 확인란), 컴파일러는 자동으로 COM 인터페이스를 생성합니다. 다시 말하지만, 추가 성과 페널티는 없습니다.

HTH!

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