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

标签 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 >.

最佳答案

我会尝试按照我的理解解释发生了什么。看起来您有以下调用工作流程(或传递的对象):.NET 4.x -> COM -> .NET 3.5。您的 Icom 接口(interface)像这样编码到 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 运行时版本。显然,它是由 .NET Runtime v4.0 创建的。

稍后的某个时刻,您尝试将其解码回来,这次是在 .NET 3.5 端。如果是 v4.0,您将返回相同的托管 Type 对象。但是,在 v3.5 中,您将获得未镜像的 System.__ComObject,它无法转换为 v3.5 托管的 Type 对象。

关于c# - 是否可以从 .net 3.5 中的 COM 互操作返回 System.Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19076346/

相关文章:

c# - 在迭代列表时从列表中删除/添加项目

c# - "ref return"是语言特性还是CLR的特性

c# - C# 是否具有与 JavaScript 的 encodeURIComponent() 等效的功能?

Windows 7 & VB 经典代码 : Any runtime issues?

java - 使用 Google 协议(protocol)生成 C# 文件失败

c# - 如何组织我的 Xamarin.Forms 解决方案?

c# - 将进程内 COM 服务器对象添加到 C# 应用程序

c++ - 进程外 COM 服务器 - 每个调用进程一个服务器进程?

c# - 如何将录制的音频序列化为XML并反序列化以在C#/xaml Metro应用中播放?

C# 列表框 ObservableCollection<T>