2

我有一堂课:

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.__ComSystem.Type.

4

1 回答 1

2

据我了解,我将尝试解释发生了什么。看来您有以下调用工作流程(或传递的对象):.NET 4.x -> COM -> .NET 3.5。您的Icom界面像这样 (OleView) 编组到 COM:

[
  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 运行时版本。显然,它是由 .NET Runtime v4.0 创建的。

稍后,您会尝试将其解组,这次是在 .NET 3.5 端。如果是 v4.0,您将获得相同的托管Type对象。但是,使用 v3.5,您会得到一个 unamaged System.__ComObject,它不能转换为 v3.5 托管Type对象。

于 2013-09-29T12:58:37.023 回答