2011-07-29 10 views
5

Trong chương trình .NET tôi có thể create a generic type bởi:Cách tạo loại .NET chung trong ứng dụng gốc C++ lưu trữ CLR (không sử dụng C++/CLI)?

System::Type::MakeGenericType(...) 

Phải có một cách để làm điều đó trong bản C++ cho một loại NET (với _TypePtr). Tôi đang lưu trữ cá thể CLR của riêng mình và không sử dụng C++/CLI. (. Here's an example of how that can be done) Biện pháp của tôi cho điều đó là:

_TypePtr BuildGenericType(_TypePtr spGenericType, _TypePtr spTypeArgs[]) 
{ 
    return spGenericType-> ..... ??? 
} 

Nhưng không có phương pháp như MakeGenericType, và tôi không biết được nơi để tìm thấy nó. Bất kỳ ý tưởng về cách giải quyết này?

+0

Tôi đã gắn thẻ C++/CLI này, vì tôi nghĩ đó là cách duy nhất có ý nghĩa. Đúng nếu tôi sai. –

+0

không cli một clr tổ chức của nó. –

+0

@ nemcija: Thật hiếm khi làm điều đó, và tôi đã chỉnh sửa câu hỏi của bạn để đề cập đến nó. – Puppy

Trả lời

3

Cuối cùng tôi đã tìm được cách giải quyết khác. Lúc đầu tôi cần một lắp ráp bổ sung mà kết thúc tốt đẹp Hệ thống :: TypeBuilder

/// <summary> 
/// Wrapper for System::TypeBuilder 
/// </summary> 
public class TypeBuilder 
{ 
    /// <summary> 
    /// Creates a generic type out of the given arguments. 
    /// </summary> 
    /// <param name="generic">The unqualified generic type.</param> 
    /// <param name="typeArgs">The typearguments for the generic type.</param> 
    /// <returns>The qualified generic type.</returns> 
    public static Type MakeGenericType(Type generic, params Type[] typeArgs) 
    { 
     return generic.MakeGenericType(typeArgs); 
    } 
} 

này assemly thêm tôi tải từ C++

Và có tôi chạy những dòng này sexy, nơi CLRAssembly là một lớp trừu tượng cho clr.

_TypePtr CLRAssembly::BuildType(_TypePtr spGenericType, _TypePtr spTypeArgs[]) 
{ 
    LONG index = 0; 
    SAFEARRAY* psaArgs = SafeArrayCreateVector(VT_VARIANT, 0, 1 + (sizeof(spTypeArgs)/sizeof(_TypePtr))); 
    SafeArrayPutElement(psaArgs, &index, &_variant_t((IUnknown*)spGenericType, true)); 
    for(int i = 0; i < sizeof(spTypeArgs)/sizeof(_TypePtr); i++) { 
     index++; 
     SafeArrayPutElement(psaArgs, &index, &_variant_t((IUnknown*)spTypeArgs[i], true)); 
    } 

    return (_TypePtr)clraAssemblyHelper->RunMethod(L"AssemblyHelper.TypeBuilder", L"MakeGenericType", psaArgs); 
} 

Cuối cùng tôi có thể chạy phương pháp ví dụ của tôi như thế này:

DDDElements::Defs* ListDefs::AddNew() 
{ 
    _TypePtr params[1]; 
    params[0] = clra->BuildType(L"DDD.Elements.Defs"); 
    _TypePtr spType = clra->BuildType(clra->BuildType(L"DDD.ElementList`1"), params); 
    return new DDDElements::Defs(clr, clra, 
     clra->RunMethod(spType, vtCLRObject, L"AddNew") 
    ); 
} 

Cuối cùng nó hoạt động khá tốt. :)

/Solved