2010-03-06 2 views
1

나도 반환 값과 같은 복잡한 객체를 사용하는 방법에 대한 도움말 후있어 또는호출 C#을 "단지"유형

가 여기 COM 구성 요소로 관리되지 않는 C++에 노출 C# 클래스 메소드에 매개 변수로 전달 이유 :

각 Microsoft SQL Server 데이터베이스에 직접 액세스하는 관리되지 않는 C++ 응용 프로그램이있는 프로젝트를 진행하고 있습니다. 최소한의 변경으로 MS-SQL/Oracle/MySql을 사용할 수 있기를 원하며 WCF 서비스를 통해 공개 된 비즈니스 로직과 데이터 레이어를 구현하여 필요한 유연성을 확보하기로 결정했습니다.

이 전략은 관리되지 않는 C++에서 WCF 서비스와 상호 작용할 수 있는지 여부에 달려 있습니다. 이를 수행하는 방법은 여러 가지가 있지만, 따라야 할 전략은 C++과 WCF 레이어 사이의 다리 역할을하는 COM 구성 요소로 노출 된 C# 어셈블리를 만드는 것입니다. 이 C# 어셈블리는 비 관리 C++ 프로세스에 COM 구성 요소로로드됩니다.

C# 브릿지 어셈블리에는 이전에 C++ 코드에서 직접 SQL 또는 저장된 proc 호출로 표현 된 작업을 설명하는 여러 가지 메서드가있는 도우미 클래스가 포함됩니다.

난 I 엔티티를 나타내는 개체가 삽입 통과 할 필요을 삽입)

1

를 해결하기 위해 두 가지 문제점이있다. 관리되지 않는 C++ 측에서는 엔티티 중 하나에 SQL로 만들어야하는 약 40 개의 속성이 있음을 알고 있습니다. 40 개 매개 변수로 C# 메서드를 사용하지 않고 개체를 전달하려고합니다. C# 객체를 COM을 통해 C#으로 마샬링하는 방법을 모르므로 C# 측에 Stuct를 정의한 다음 구조체 COM을 표시하도록 생각했습니다.

2) "SELECT this, that, other, ..."의 결과를 반환하는 방법. 나는 두 가지 예를 보았다. 하나는 struct []를 반환하고 다른 하나는 각 열 필드에 대한 문자열 [] 및 다른 멤버 배열의 길이를 설명하는 int count 멤버를 포함하는 단일 구조체를 반환합니다.

C# 측에서는 데이터를 전달/전송하는 데 사용될 요청/응답 구조체를 정의하고 노출하는 경우가 될 것이라고 생각합니다. 이 구조체는 최적화 결과로 멤버가 "위치 변경"을하지 않도록하는 속성으로 꾸며야합니다. 그리고 구조체 멤버는 marshaller에게 COM에서 멤버가 노출되는 방법을 암시하는 속성으로 꾸며질 필요가 있습니다.

물론 관리되지 않는 C++에서 COM 개체로 본 것처럼 이러한 인스턴스를 인스턴스화하고 채우는 방법을 알아야합니다. 그런 다음 메서드 호출에 전달하고 반환 값으로 처리해야합니다.

이것은 나를 위해 가장 어려운 부분입니다. 나는 C++과 일부 MFC/ATL을 상상하지만 C++에서 COM은 복잡성의 전체 레벨이다. 필자가 설명한대로 매개 변수 전달 및 반환 값 처리에 대한 권장 도서, 블로그, 자습서가 실제로 도움이 될 것입니다.

답변

2

가능하면 COM을 그림으로 가져 오는 것이 좋습니다. C++ 코드를 제어하는 ​​경우에는 C# 코드를 호출하는 단일 C++/CLI cpp 파일을 추가하는 것이 더 쉬워야합니다. C++/CLI는 관리되는 유형과 관리되지 않는 유형을 직접 액세스하고 생성 할 수 있습니다.

+0

확실히 좋은 생각입니다. 어떤 이유로 C++ 코드를 C++/CLI로 컴파일하지 않으려는 경우 관리되지 않는 함수/클래스를 내보내는 별도의 DLL에 C++/CLI 코드를 만들 수도 있습니다. .NET COM 코드가 제공하는 자동 마샬링은 느슨하게 수행되지만 잠재적 인 골칫거리가 될 수 있습니다. – shf301

+0

예, C++ 코드를 제어 할 수 있습니다.프로젝트 레벨에서 clr 지원을 켜려고했으나/MTd와/clr 스위치가 호환되지 않는다는 오류가 나타났습니다. 그래서 CoInitialize를 호출하는 다른 오류가 발생하지 않는 한 C++을 거의 변경하지 않고 그대로 COM 경로로 이동했습니다. C++/CLI DLL을 만드는 경우 동일한 위치에 있지 않습니까? 즉 그것의 내용을 수출해야합니다. 현재 COM을 사용하지 않는 비 관리 C++ 응용 프로그램에 C++/CLI dll을 어떻게 추가합니까? – IanT8

+0

/MTd는 실제로 C++/CLI와 호환되지 않는 C++ 런타임 lib의 정적 연결을 의미합니다. DLL로 연결하면 괜찮을 것입니다. 모든 코드를 C++/CLI로 컴파일 할 필요는 없습니다. 대신 프로젝트 수준에서 활성화하고 .net과 통신해야하는 새 파일을 제외한 모든 파일을 비활성화하십시오. –