是否可以从.net 3.5中的COM互操作返回System.Type?

时间:2013-09-29 09:17:19

标签: c# .net com com-interop

我有一个班级:

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的错误。

1 个答案:

答案 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对象。