РЕЗЮМЕ: В моем проекте используется 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" />
... так дублированные разделы с отсутствующими «имя» атрибуты.
В идеале я хотел бы просто использовать свой известный, хороший файл манифеста, так что я создал, что и добавил к моему проекту:
Однако, даже после того, как говорить Visual Studio НЕ генерировать файл манифеста и создание нового в моем проекте на основе этого конкретного файла манифеста, он настаивает на том, чтобы возиться с ним.
Как я могу сгенерировать файл манифеста, который именно это я вам скажу, без того, чтобы Visual Studio добавляла к нему вещи и ломала их?
EDIT: Я проверил, и Изолированный флаг на Reference'd DLL является Ложные:
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
СЛУЧАЕВ линия появляется в созданный манифест.
Если вы не работаете в Microsoft, вы можете мало что можете сделать о том, как VS генерирует манифест. Нежелательная информация в реестре, в которой это происходит, вероятно, имеет вид с Regedit.exe. HKLM \ Sofware \ Wow6432Node \ Classes \ Interface \ {iid}. Просто сделай свой собственный манифест. Проект> Добавить новый элемент> Файл манифеста приложений. Не возитесь с тем, что там, объедините записи regfree в него. –
Я создал свой собственный манифест и попросил VS использовать его, но он добавляет дополнительные строки и целые разделы в файл - и разбивает его. Если я копирую свой «хороший» манифест поверх файла bin \ debug, он отлично работает. – KenD
@HansPassant: no, Isolated is False - см. Скриншот выше – KenD