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
Nguồn
2011-07-30 10:54:58
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. –
không cli một clr tổ chức của nó. –
@ 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