2014-07-23 2 views
2

C# dll (COM interop 옵션에 대한 레지스터가 설정된 경우)이 있습니다.Managed C# List를 관리되지 않는 C++ 코드로 반환

이 C#을 dll은 아래의 인터페이스와 클래스 I가 관리되지 않는 C++에서 방법의 IsNameExists 및 GetNameList를 호출 할 필요가

interface IMyInterface 
{ 
    bool IsNameExists(string name); 
    List<string> GetNameList(); 
} 

public class MyClass : IMyInterface 
{ 

    public bool IsNameExists(string name) 
    { 
     //DO Something 

    } 
    public List<string> GetNameList() 
    { 

     // DO something 
    } 

} 

있습니다.

위와 같이 COM 개체를 생성하고 아무런 문제없이 IsNameExists 메서드를 호출했습니다. GetNameList 방법이 목록을 반환하기 때문에

, 나는 아래의 경고

'MyDll.IMyInterface.GetNameList (# 0), MyDll'을 얻고있다. 경고 : 형식 라이브러리 내보내기에서 서명에 제네릭 형식 인스턴스가 발생했습니다. 일반 코드를 COM으로 내보낼 수 없습니다.

비 관리 C++ 코드로 C# 목록을 반환하는 방법을 알려주십시오. 따라서 관리되지 않는 C++ 코드는이 목록을 사용할 수 있습니다.

+0

COM은 .NET 제네릭에 대한 빈을 알고 있습니다. 대신 ArrayList 또는 제네릭이 아닌 IEnumerator 또는 자신의 컬렉션 인터페이스를 반환하십시오. –

답변

0

'일반 코드를 COM으로 내보낼 수 없습니다.' => 따라서 공용 목록 GetNameList()에서 형식 매개 변수 문자열입니다. 따라서 본질적으로 비 제네릭 C# 메서드에 액세스하여 데이터를 가져와야합니다. 위의 비슷한 할 수있는 프록시/래퍼 클래스를 작성해야하지 다음 경우

public string[] GetNameArray() 
{ 
    return GetNameList.ToArray(); 
} 

과 : 당신은 MyClass의 코드베이스의 컨트롤이있는 경우

당신은 (예를 들어)를 추가 할 수 있습니다 COM을 통해 그 중 하나를 해제하거나 '일반'방법론을 사용하여 반사를 말합니다.

예를 들어 http://weblog.west-wind.com/posts/2007/Jul/10/Generics-and-COM-Interop-dont-mix

+0

당신이 어떻게 문자열 []에 액세스 할 수 있습니다 unmanaged C++에서 –

+0

확실하지 않은 _IF_ MyClass 및 IMyInterface 변경할 수 있습니다. 그런 다음 위의 메서드를 추가하는 옵션을 제안하는 경우 호출 할 때 호출 할 수 있습니다. 전화 IsNameExists – tolanj

+0

C#에서 위의 GetNameArray() 메서드를 추가 할 수 있습니다. C++에서 문자열 []을 검색 할 수있는 방법을 알고 싶습니다. –

관련 문제