Возник такой вопрос создаю 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
Как это можно победить? Может кто знает