创建IDispatch .NET COM类,其中内容仅在运行时可用

时间:2009-08-10 04:53:43

标签: .net com interop managed-c++

我目前正在将一些代码从本机C ++迁移到托管C ++(纯)。该代码涉及与Windows Active Scripting交互。目前我们的本机代码提供了 名为'ObjectDispatch'的类,它实现'IDispatch'(使用ATL)。这个类实现在运行时查询我们自己的本机类'Object',以确定它支持哪些方法和属性,然后将任何'IDispatch :: Invoke'调用转发给这个'Object'。

我见过使用支持'IDispatch'的.NET COM互操作的示例,但是那些从IDL派生或基于规范的实现 .NET类,在运行时都不会发生。

似乎.NET COM互操作可以生成'IDispatch'的实现 在编译时,如果您在给定的类上使用以下属性:

[ClassInterface(ClassInterfaceType::AutoDispatch)]

我假设我可以在运行时动态生成一个支持该属性的类。然而,在我尝试之前,我想知道是否有人有任何想法 如何通过与本机代码一起使用的类似方法实现这一目标。

请注意,此时“Object”类仍保留为本机类。

1 个答案:

答案 0 :(得分:1)

得到微软的一些官方反馈意见“可能”有效。没有时间确认,但如果有人感兴趣,我认为发布是个好主意。

    [Guid("00020400-0000-0000-c000-000000000046"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IDispatch
    {
        int GetTypeInfoCount();


    ITypeInfo GetTypeInfo(
        [MarshalAs(UnmanagedType.U4)] int iTInfo,
        [MarshalAs(UnmanagedType.U4)] int lcid);

    [PreserveSig]
    int GetIDsOfNames(
        ref Guid riid,
        [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
        int cNames,
        int lcid,
        [MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);

    [PreserveSig]
    int Invoke(
        int dispIdMember,
        ref Guid riid,
        [MarshalAs(UnmanagedType.U4)] int lcid,
        [MarshalAs(UnmanagedType.U4)] int dwFlags,
        ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
        [Out, MarshalAs(UnmanagedType.LPArray)] object[] pVarResult,
        ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
        [Out, MarshalAs(UnmanagedType.LPArray)] IntPtr[] pArgErr);
}

class IImplimentIDispatch : IDispatch
{
    public IImplimentIDispatch(object o)
        {
             _o = o;
…