2015-12-23 2 views
4

РЕЗЮМЕ: В моем проекте используется COM-компонент, который необходимо зарегистрировать самостоятельно. Проект имеет собственный пользовательский myapp.exe.manifest файл, который включает в себя две линии:Дублирующие строки, сгенерированные в. Манифесте

<comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 

Однако создание проекта генерирует эти файлы в самом прямом файле:

<comInterfaceExternalProxyStub name="" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
<comInterfaceExternalProxyStub name="" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
<comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 

Другими словами, дублирующие строка с отсутствующими значениями атрибутов, которая, естественно, вызывает ошибку при запуске приложения.

Если я удаляю одну из «исходных» строк из исходного манифеста, как дублирующий дубликат, так и правильная строка исчезают из сгенерированного манифеста, т. Е. Комментируют строку ICapturer, и обе строки и ее дубликаты aren ' т.

Указанный компонент имеет как «Embed Interop», так и «Isolated» значение false (см. Снимок экрана ниже).

Учитывая, что Visual Studio всегда хочет генерировать манифест (хотя я просил его специально использовать мой файл), как я могу остановить продублированные строки?

ОРИГИНАЛЬНЫЙ ВОПРОС TEXT:

Исходя из моего previous question, у меня было трудное время получить COM-компонент развернут с моим приложением ClickOnce. Я решил эту проблему сейчас, но она включала редактирование сгенерированного файла , чтобы включить некоторые параметры, которые были опущены.

Я поместил файл манифеста в свой проект, но каждый раз, когда я его создаю, он восстанавливает манифест, который почти, но не совсем тот же. У меня есть разделы, которые повторяются: например, в моем app.manifest у меня есть:

<comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 

но генерируемый exe.manifest имеет:

<comInterfaceExternalProxyStub name="" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
    <comInterfaceExternalProxyStub name="" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
    <comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
    <comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 

... так дублированные разделы с отсутствующими «имя» атрибуты.

В идеале я хотел бы просто использовать свой известный, хороший файл манифеста, так что я создал, что и добавил к моему проекту:

enter image description here

Однако, даже после того, как говорить Visual Studio НЕ генерировать файл манифеста и создание нового в моем проекте на основе этого конкретного файла манифеста, он настаивает на том, чтобы возиться с ним.

Как я могу сгенерировать файл манифеста, который именно это я вам скажу, без того, чтобы Visual Studio добавляла к нему вещи и ломала их?

EDIT: Я проверил, и Изолированный флаг на Reference'd DLL является Ложные:

enter image description here

EDIT2: Интересно, если я закомментировать либо из comInterfaceExternalProxyStub секций в файле манифеста проекта , BOTH строки опущены из сгенерированного файла. Кажется, что наличие этих строк в моем манифесте каким-то образом генерирует TWO строки в сгенерированном файле - они почти идентичны, но они не имеют атрибута «Имя». Таким образом, чтобы проиллюстрировать: имея одну строку в app.manifest:

<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 

генерирует эти две линии в реальной сборки:

<comInterfaceExternalProxyStub name="" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" /> 

Если я закомментируйте comInterfaceExternalProxyStub линию в app.manifest СЛУЧАЕВ линия появляется в созданный манифест.

+0

Если вы не работаете в Microsoft, вы можете мало что можете сделать о том, как VS генерирует манифест. Нежелательная информация в реестре, в которой это происходит, вероятно, имеет вид с Regedit.exe. HKLM \ Sofware \ Wow6432Node \ Classes \ Interface \ {iid}. Просто сделай свой собственный манифест. Проект> Добавить новый элемент> Файл манифеста приложений. Не возитесь с тем, что там, объедините записи regfree в него. –

+0

Я создал свой собственный манифест и попросил VS использовать его, но он добавляет дополнительные строки и целые разделы в файл - и разбивает его. Если я копирую свой «хороший» манифест поверх файла bin \ debug, он отлично работает. – KenD

+0

@HansPassant: no, Isolated is False - см. Скриншот выше – KenD

ответ

3

Я вижу. Непонятно, что это происходит неправильно, когда издатель Click-Once перезаписывает ваш манифест и добавляет конкретный клик по клику.

Я ткнулся в обходное решение какое-то время, есть более чем один способ сделать это. Вы можете, например, сохранить манифест компонента отдельно и использовать <dependency> в основном манифесте. Не было никакой разницы. documented schema для элемента <file> в манифесте Click-Once очень странно, обратите внимание, как он объявляет comInterfaceExternalProxyStub как ребенок file. Перемещение его в соответствии с схемой не помогло, так как элемент полностью исчез. Эта документация просто ошибочна, предвестник неприятностей.

Короче говоря, это ошибка. Это не странная ошибка, документация приложения явно чрезмерно бедна, и особенно для comInterfaceExternalProxyStub. Несколько раз я использовал имя Юнфэн Чжан, это было в предложении со словами, которые я не могу повторить здесь.

Вы можете сообщить об этом на сайте connect.microsoft.com. Никаких предыдущих отчетов для этого, как ни странно, но, безусловно, большинство программистов либо не нуждались в нем, либо не пытались или не сдавались, и попросили пользователя установить COM-компонент в качестве предварительного условия. Это вполне нормально и, возможно, подход, который вы должны принять. Помимо этого, редактирование манифеста вручную и удаление дополнительных строк является обходным путем.

И не забудьте попробовать наиболее очевидное обходное решение, comInterfaceExternalProxyStub не часто требуется и не будет сгенерирован, если вы используете свойство Isolated в ссылке на сборку. То, как это делает подавляющее большинство программистов, и совет, который я дал вам раньше. До тех пор, пока вы не используете COM-компонент из рабочего потока, тогда прокси не нужен.

+0

Спасибо за подробный ответ, и я рад, что это ошибка, а не я делаю что-то глупое:/К сожалению, я * am * использую COM-компонент из рабочий поток. Я попытался стать умным, скопировав свой «хороший» «манифест» на место с процессом пост-сборки, но это просто нарушает манифестное подписание. Разочаровывающе, мне нужно искать другой пакет для интеграции с моим приложением, просить пользователя установить COM-компоненты отдельно, это не вариант. Еще раз спасибо. – KenD

1

Если вы счастливы с этим решением, вы должны быть в состоянии предотвратить Visual Studio из автоматического создания файла манифеста:

Однако можно отключить генерацию манифеста для проекта с использованием Сгенерировать свойство Манифест проекта. Если для этого свойства установлено значение Да, генерируется манифест для этого проекта. В противном случае компоновщик игнорирует информацию о сборке при разрешении зависимостей кода приложения и не генерирует манифест.

Source (MSDN)

Если это не работает (как вы, кажется, предполагают), вы можете попытаться изменить свои метки. Сравнение сгенерированных «пустых» тегов и ваших тегов показывает, что у вас отсутствует атрибут numMethods. (diff)

+0

К сожалению, похоже, что ClickOnce всегда хочет «восстановить» файл манифеста, даже когда я сказал ему это не делать. Я попытался добавить в 'numMethods', но он все еще дублирует строку :( – KenD

Смежные вопросы