0

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

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

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

[ClassInterface(ClassInterfaceType::AutoDispatch)]

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

请注意,此时“对象”类仍作为本机类。

4

1 回答 1

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;
…
于 2009-12-22T01:25:31.347 回答