0

現在、一部のコードをネイティブ C++ からマネージ C++ (純粋) に移行中です。コードには、Windows Active Scripting との対話が含まれます。現在、私たちのネイティブ コードは、(ATL を使用して)「IDispatch」を実装する「ObjectDispatch」というクラスを提供します。このクラスの実装は、実行時に独自のネイティブ クラス「オブジェクト」にクエリを実行して、サポートするメソッドとプロパティを判断し、「IDispatch::Invoke」呼び出しをこの「オブジェクト」に転送します。

'IDispatch' をサポートする .NET COM 相互運用機能を使用した例を見てきましたが、これらの実装は IDL から派生したものか、.NET クラスの仕様に基づいたものであり、どちらも実行時に発生しません。

特定のクラスで次の属性を使用すると、.NET COM 相互運用機能がコンパイル時に「IDispatch」の実装を生成できるようです。

[ClassInterface(ClassInterfaceType::AutoDispatch)]

この属性をサポートするクラスを実行時に動的に生成できると想定しています。ただし、それを試みる前に、ネイティブ コードで使用されたのと同様の手段でこれを実現する方法について誰かアイデアを持っているかどうか疑問に思っています。

現時点では、'Object' クラスはネイティブ クラスのままであることに注意してください。

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 に答える