Имена в сборке взаимодействия имеют неправильную прописную букву - PullRequest
7 голосов
/ 31 июля 2009

У меня есть COM-компонент VC ++ с библиотекой типов. Библиотека типов этого компонента объявляет интерфейс и совместный класс:

[
    object,
    uuid( ActualUuidHere),
    dual,
    nonextensible,
    oleautomation,
    hidden,
    helpstring( ActualHelpStringHere )
]
interface IWorkflow : IDispatch 
{
    //irrelevant properties here    
}

[
    uuid(ActualClassIdHere),
    noncreatable
]
coclass Workflow {
    [default] interface IWorkflow;
};

Чтобы использовать компонент из приложения C #, я добавляю ссылку на проект C # и создается сборка взаимодействия.

В обозревателе объектов Visual Studio 2003 я вижу, что взаимодействие содержит:

public abstract interface IWorkflow;
public abstract interface workflow : IWorkflow;
public class workflowClass : System.Object;

Понятно, что по какой-то причине название класса и интерфейс отличаются заглавными буквами. Этого не происходит для других 20+ интерфейсов, объявленных в той же библиотеке типов - для них ISomething соответствует Something и SomethingClass.

Я просмотрел файлы .idl проекта - идентификатор Workflow больше нигде не используется.

В чем причина этого странного поведения и как его можно обойти?

Ответы [ 2 ]

7 голосов
/ 31 июля 2009

Просмотрите ваш код и посмотрите, есть ли какой-либо параметр, свойство или имя метода, которые имеют точное написание и заглавную букву «рабочего процесса». Это почти наверняка будет параметром функции интерфейса COM. Измените имя на paramWorkflow, и ваша проблема должна исчезнуть.

Почему это происходит? В инструментах библиотеки типов есть ошибка, из-за которой они будут хранить идентификаторы внутренне без учета регистра. Таким образом, если у вас есть два имени с разной капитализацией, они будут храниться в одном слоте. Эти имена затем напрямую используются во время генерации, поэтому будет выпущен другой регистр.

Способ обойти эту проблему - предотвратить конфликт путем создания разных имен.

1 голос
/ 31 июля 2009

Взгляните на новый настраиваемый инструмент tlbimp:

https://blogs.msdn.microsoft.com/dotnet/2009/03/19/new-tlbimp-release-on-codeplex-full-customization-of-interop-assemblies/

Настройка правил взаимодействия на основе правил

Новая утилита TlbImp позволяет пользователям настраивать сборку взаимодействия процесс преобразования в TlbImp, указав набор правил для настроить указанные типы / функции / подписи. Мы получили много отзывы пользователей TlbImp о том, что им нужна возможность собственные изменения в сборке взаимодействия в процессе сборки, и они в конечном итоге, используя ILDASM для разборки сборки взаимодействия в код IL, изменить его с помощью сценария PERL, а затем использовать ILASM для повторного создания межоперационная сборка. Это, очевидно, болезненный процесс и требует много дополнительной работы. Эта функция предназначена для решения этой проблемы проблема.

Инструмент регрессионного тестирования

Чтобы помочь разработчикам убедиться, что его изменение не вызывает каких-либо регрессии, мы разработали простой инструмент регрессионного теста

...