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。この場合、 Unable to cast というエラーが表示さSystem.__ComSystem.Typeます。

4

1 に答える 1

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アンマネージ プロキシであることに注意してください。その実装は、各 .NET ランタイム バージョンに固有です。どうやら、.NET ランタイム v4.0 によって作成されます。Typemscorlib.dllmscorlib.tlb

後で、今度は .NET 3.5 側でアンマーシャリングしようとしています。v4.0 の場合は、同じ管理Type対象オブジェクトが返されます。System.__ComObjectただし、v3.5 では、v3.5 管理対象オブジェクトに変換できないunimaged を取得していTypeます。

于 2013-09-29T12:58:37.023 に答える