Мы разработали сборку .NET под названием XXadapter. Цель состоит в том, чтобы заставить XXadapter действовать как COM-объект для неуправляемых клиентов. Класс XXadapter реализует интерфейс C++ COM IDL. Объект C++ COM был добавлен в качестве ссылки на проект C#, таким образом предоставляя COM API через Interop. Поэтому интерфейс интерфейса класса _XXadapter был сгенерирован COM Interop и используется неуправляемыми клиентами.Интерфейс uuid и DispID интерфейса интерфейса изменяется при переходе с Visual Studio 2010 на 2012 год
Все было хорошо, пока я не попытался перенести проект XXadapter с VS2010 на VS2012 (обратите внимание, что нет изменений исходного кода). Ошибка uuid _XXadapter и часть DispID метода в _XXadapter были изменены.
Это свойство Класса XXadapter в:
[ComVisible(true)]
[ComSourceInterfaces(typeof(_IBaseEvents))]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("class ID")]
public partial class XXadapter : ICOMInterface
{
...
}
Здесь вы _XXadapter определения в библиотеке типов (если смотреть на OLEView.exe) до миграции:
[
odl,
uuid(E8******-****-****-****-************),
hidden,
dual,
nonextensible,
oleautomation,
custom(123456-1234-1234-1234-123456789012, CompanyName.XXadapter)
]
interface _XXadapter : IDispatch {
[id(00000000), propget,
custom(654321-4321-4321-4321-210987654321, 1)]
HRESULT ToString([out, retval] BSTR* pRetVal);
[id(0x60020001)]
HRESULT Equals(
[in] VARIANT obj,
[out, retval] VARIANT_BOOL* pRetVal);
[id(0x60020002)]
HRESULT GetHashCode([out, retval] long* pRetVal);
[id(0x60020003)]
HRESULT GetType([out, retval] _Type** pRetVal);
[id(0x60020004)]
HRESULT GetVersion([out, retval] BSTR* pRetVal);
[id(0x60020005)]
HRESULT Method_one(...);
[id(0x60020006)]
HRESULT Method_two(...);
...
[id(0x6002000e)]
HRESULT Method_three(...);
[id(0x6002000f)]
HRESULT Method_four();
[id(0x60020010)]
HRESULT Method_five(...);
...
};
После перенастройки _XXadapter, определяемый как
[
odl,
uuid(E6****-****-****-****-************),
hidden,
dual,
nonextensible,
oleautomation,
custom(123456-1234-1234-1234-123456789012, CompanyName.XXadapter)
]
interface _XXadapter : IDispatch {
[id(00000000), propget,
custom(654321-4321-4321-4321-210987654321, 1)]
HRESULT ToString([out, retval] BSTR* pRetVal);
[id(0x60020001)]
HRESULT Equals(
[in] VARIANT obj,
[out, retval] VARIANT_BOOL* pRetVal);
[id(0x60020002)]
HRESULT GetHashCode([out, retval] long* pRetVal);
[id(0x60020003)]
HRESULT GetType([out, retval] _Type** pRetVal);
[id(0x60020004)]
HRESULT GetVersion([out, retval] BSTR* pRetVal);
[id(0x60020005)]
HRESULT Method_three(...);
[id(0x60020006)]
HRESULT Method_four(...);
[id(0x60020007)]
HRESULT Method_five(...);
[id(0x60020008)]
HRESULT Method_one(...);
[id(0x60020009)]
HRESULT Method_two(...);
...
};
Изменен не только uuid _XXadapter, но и DispID всех методов_XXXX().
В результате сборка _XXadapter утратила свою обратную совместимость со своими COM-клиентами.
Изучив и выполнив поиск по этой проблеме, я обнаружил, что переупорядочение Method_three/four/five() в библиотеке типов может быть вызвано этими тремя методами: partially declared в отдельном файле. Я попытался переместить объявление для всех видимых методов COM в один и тот же файл, эта проблема может быть решена. Однако это делает огромный файл, который мы изначально хотели избежать. Есть ли решение сохранить обратную совместимость, не перемещая COM видимые методы? Кто-нибудь знает основную причину переупорядочения методов? Огромное спасибо.
Является ли ваш клиент COM ранним или поздним? Кроме того, можете ли вы показать некоторые (по крайней мере, заголовок) вашего класса C#? – Noseratio
Спасибо Noseratio. Класс XXadapter частично определен со следующими атрибутами: '[ComVisible (true)] [ComSourceInterfaces (typeof (_IXXXEvents))] [ClassInterface (ClassInterfaceType.AutoDual)] [Guid (" 15 ****** - ** ** - **** - **** - ************ ")] Публичный частичный класс XXadapter: IXXVersion {...}' – Chloe
Я [объяснил] (http : //stackoverflow.com/a/19777899/1768303), как вы могли бы попытаться имитировать бинарную совместимость, @Ivy. Стоит сделать снимок. – Noseratio