我有一个班级:
public class A
{
public void Test()
{
Type t = icom.ReturnType;
}
}
[ComVisible(true),
Guid("81C99F84-AA95-41A5-868E-62FAC8FAC263"),
InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface Icom
{
Type ReturnType { get; }
}
[ComVisible(true)]
[Guid("6DF6B926-8EB1-4333-827F-DD814B868097")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(Icom))]
public class B : Icom
{
public Type ReturnType
{
get
{
return SomeAssembly.GetType("fullname");
}
}
}
这在.NET 3.5中是否可以实现?我的目标是从B类返回System.Type
。在这种情况下,我收到一条无法将System.__Com
投射到System.Type
的错误。
答案 0 :(得分:2)
据我所知,我会试着解释发生了什么。您似乎有以下调用工作流程(或正在传递的对象):.NET 4.x - > COM - > .NET 3.5。您的Icom
接口被封送到COM(OleView):
[
odl,
uuid(81C99F84-AA95-41A5-868E-62FAC8FAC263),
version(1.0),
dual,
oleautomation,
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "InteropTest.Icom")
]
interface Icom : IDispatch {
[id(0x60020000), propget]
HRESULT ReturnType([out, retval] _Type** pRetVal);
};
请注意_Type
,它是托管Type
类的非托管代理,在mscorlib.dll
(类型库mscorlib.tlb
)中实现。它的实现特定于每个.NET Runtime版本。显然,它是由.NET Runtime v4.0创建的。
在某些时候,你正试图将它重新编组,这次是在.NET 3.5端。如果是v4.0,则会返回相同的托管Type
对象。但是,使用v3.5,您将获得未损坏的System.__ComObject
,无法将其转换为v3.5托管Type
对象。