Вопрос по наследованию интерфейсов
От: Аноним  
Дата: 10.03.10 13:23
Оценка:
Возник такой вопрос создаю com объект выкатываю интерфейсы
Публикую интерфейс I1 и I2 наследованный от I1
Публикую и тоже самое для классов С1 и С2 наследованный от С1
Для классов можно сказать работает
а вот для интерфейсов получается странная картина:

Вот примерный код:
using System.Text;
using System.Reflection;
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32;

[assembly: AssemblyDescription(" My.COM")]

namespace My.COM
{
    [ProgId("MyAPP.API")]
    [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual), Guid("5d1282bf-28a8-417d-9527-7de2cfb64238")]
    public class MyAPI
    {
        #region auto registration
        [ComRegisterFunction()]
        public static void RegisterClass(string key)
        {
            StringBuilder sb = new StringBuilder(key);
            sb.Replace(@"HKEY_CLASSES_ROOT\", "");
            RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
            RegistryKey ctrl = k.CreateSubKey("Control");
            ctrl.Close();
            RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
            inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
            inprocServer32.Close();
            k.Close();
        }
        [ComUnregisterFunction()]
        public static void UnregisterClass(string key)
        {
            StringBuilder sb = new StringBuilder(key);
            sb.Replace(@"HKEY_CLASSES_ROOT\", "");
            RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
            k.DeleteSubKey("Control", false);
            k.OpenSubKey("InprocServer32", true);
            k.DeleteSubKey("CodeBase", false);
            k.Close();
        }
        #endregion
    }

    [ComVisible(true),InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface I1
    {
        void fn1();
    }
    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface I2 : I1
    {
        void fn2();
    }
    [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
    public abstract class C1
    {
        public abstract void fn1();
    }
    [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
    public abstract class C2 : C1
    {
        public abstract void fn2();
    }
}


В результате в type library я не вижу наследования I2 от I1
Но в C2 присутствуют оба метода fn1 и fn2
...
    interface I1 : IDispatch {
        HRESULT fn1();
    };

    interface I2 : IDispatch {
        HRESULT fn2();
    };

    interface _C1 : IDispatch {
        HRESULT ToString([out, retval] BSTR* pRetVal);
        HRESULT Equals(
                        [in] VARIANT obj, 
                        [out, retval] VARIANT_BOOL* pRetVal);
        HRESULT GetHashCode([out, retval] long* pRetVal);
        HRESULT GetType([out, retval] _Type** pRetVal);
        HRESULT fn1();
    };

    interface _C2 : IDispatch {
        HRESULT ToString([out, retval] BSTR* pRetVal);
        HRESULT Equals(
                        [in] VARIANT obj, 
                        [out, retval] VARIANT_BOOL* pRetVal);
        HRESULT GetHashCode([out, retval] long* pRetVal);
        HRESULT GetType([out, retval] _Type** pRetVal);
        HRESULT fn1();
        HRESULT fn2();
    };
...


В результате всякие VisualBasic-и н т.п. которые импортируют эту typelib вернув тип I2 не видят поля I1
Как это можно победить? Может кто знает
com c# interface
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.