2009-05-12 6 views
6

많은 새로운 비즈니스 및 통신과 결합하여 신제품에 사용하려는 UI를 제공하는 포괄적 인 관리되지 않는 Windows CE 5 C++ 코드가 있습니다. Windows CE 6 및 Compact Framework에서 관리되는 C#으로 작성된 논리HOWTO : 관리되는 C# 인터페이스를 관리되지 않는 C++에서 WindowsCE Compact Framework에서 호출

UI는 비즈니스 로직을 알고 있을지 모르지만 비즈니스 로직을 UI에 대해 모르는 상태에서 나중에 관리되는 버전 또는 프런트 엔드로 선택한 다른 UI로 바꿀 수 있기를 바랍니다.

Windows에서 COM을 브리지로 사용하는 방법을 설명하는 기사가 있지만 WinCE에서 .NET CF에 적용하는 데 어려움이 있습니다. 과거에는 형식 라이브러리를 가져오고 다른 Windows 플랫폼의 인터페이스에 대한 포인터를 얻기 위해 COM 호출 (CoInitialize(), CoCreateInstance())을 사용했습니다. 그 순간 제가 추구하는 전략은 다음과 같습니다. 동일한 관리 기능이 WinCE에서 제공된다고 가정 할 때 관리되지 않는 C++ 라이브러리가 관리되는 라이브러리의 C# 인터페이스에 액세스합니다.

여기 내 문제가 있습니다. typelib입니다. 이전에 '#import "SomeCPPLibrary.dll"문을 통해 사용한 적이 있으므로 관리되는 C# 라이브러리에서는 사용할 수 없습니다. 저는 그것이 .dll 어셈블리에 묻혀 있고 과거와 다른 방식으로 저장되어 있기 때문에 라이브러리 자체의 # import를 통해 직접 사용할 수 없습니다. 내 생각 엔 형식 라이브러리를 # import 할 수는 있지만 관리되는 .dll에서 typelib을 추출 할 수있는 방법을 찾지 못하고 인터페이스 정의 파일 (.idl)을 해킹하고 플랫폼의 midl.exe를 사용할 수는 있습니다. 그것으로부터 .tlb를 생성하기 위해, 내 .idl이 결과적으로 .tlb라는 결과가 내 C# .dll과 실제로 일치한다는 보장은 없습니다. 플랫폼 midl.exe가이 방식으로 작동하는지는 모르지만 그것이 있다고 가정합니다.

  1. 나는 잘못된 나무를 짖고 있습니까? 관리되는 C# 인터페이스를 관리되지 않는 C++에서 해당 COM 인터페이스를 통해 사용할 수 있습니까?

  2. AssemblyInfo.cs 파일의 [assembly : ComVisible (true)] 특성을 설정하면 관리되는 어셈블리의 모든 인터페이스가 AssemblyInfo.cs가 정의하는 GUID를 통해 관리되지 않는 세계의 COM을 통해 사용할 수 있습니까? 더 많은 것을하기 위해?

  3. 관리되지 않는 C++ 라이브러리가 # import 할 수 있도록 관리되는 .dll에서 typelib을 가져 오는 방법은 무엇입니까?

  4. 내 관리 C# 라이브러리 프로젝트를 관리되지 않는 C++ 라이브러리 프로젝트의 참조로 추가하려고 시도했지만 도움이되지 않았습니다. 이런 상황에서 그러한 참조는 전혀 관련이 없습니까?

  5. 관리되지 않는 C++ 코드에서 관리되는 C# 코드를 호출 할 때의 기본적인 문제를 해결할 수있는 더 나은 방법이 있습니까? 여기서 방금 읽은 내용은 관리되지 않는/관리되는 갭을 메우기 위해 관리되는 변환 계층이있는 혼합 모드 라이브러리입니다. 통화 응답 속도가 중요한 요소 인만큼 좋은 전략인지는 잘 모르겠지만 어느 시점에서 UI를 관리 C#으로 다시 작성하려고 계획 할 때 장기적으로 더 나을지도 모릅니다. 따라서 모든 노력을 더 영구적 인 비즈니스/통신 로직을 사용하기보다는 UI를 버려야합니까? 이 질문에 대한 답변에 관계없이 호기심이 아닌 다른 이유로 COM을 사용하는 문제를 해결하고 싶습니다.

+0

+1 멋진 글 –

답변

3

WinCE에서 C++로부터 C#을 호출하려고 시도했습니다. Compact Framework에서 제공하는 COM 지원이 없기 때문에 ComVisible (true)을 사용할 수 없습니다.

또한 Compact Framework에서 기능이 노출되지 않았기 때문에 C++에서 .NET을 호스팅 할 수있는 방법을 찾지 못했습니다.

내 솔루션은 스텁 C# 응용 프로그램을 만들고 메시지 대기열을 통해 C++ 호스트와 통신하는 것이 었습니다. 또한 데이터 마샬링 문제도 해결됩니다. 내 사용을위한 성능이 좋습니다. 가장 큰 비용은 완료 응용 프로그램이 C# 인 경우 어쨌든 지불해야하는 스텁 시작 시간입니다.

+0

이것은 좋은 방법입니다. 네이티브 코드가 dll에 있다면, 필자는 메시지 대기열이 필요하다고 생각하지 않는다. C# 코드는 함수를 직접 호출 할 수 있으며 필요한 경우 C#을 호출 할 수있는 방법을 제공하기 위해 C#의 네이티브 DLL에 대리자/함수 포인터를 전달할 수 있습니다. – tcarvin

2

당신은 틀린 나무를 짖고 있습니다. 네이티브 코드가 관리되는 코드를 호출하려면 네이티브 코드가 CLR의 실행 엔진을 시작해야합니다. 이것은 CLR Hosting으로 알려져 있으며 CF에서는 지원되지 않습니다. 이것은 당신이 단순히 그것을 할 수 없다는 것을 의미합니다 - 창조적 인 해킹조차도 (나를 믿으십시오, 나는 모든 골목을 내려다 보았습니다).