Reg-Free COM не работает для меня - PullRequest
1 голос
/ 25 ноября 2008

Я пытаюсь понять, можно ли использовать Reg-Free COM в нашем веб-приложении для упрощения развертывания устаревших компонентов COM. Однако, прежде чем приступить к изучению таких вещей, как использование его в ситуациях взаимодействия, я не могу заставить работать простой тест. Вот что я сделал: -

1) Создайте новый проект VB ActiveX DLL. Оставил все параметры по умолчанию, кроме включения бинарной совместимости. Добавлен класс с простым методом под названием «SayHello».
2) Создайте новое консольное приложение c # в Vs.NET 2008 (SP1). Установите CPU на x86 и добавьте ссылку на мою COM DLL.
3) Включен «Изолированный» для справки
4) Вызовите мой метод SayHello из консольного приложения c # - все работает.
5) Вручную отмените регистрацию COM DLL с помощью regsvr32 / u
6) Попробуйте снова запустить консольное приложение. Приложение завершается с ошибкой COM, потому что не может найти информацию о регистрации COM. Я могу подтвердить, что манифест присутствует (вставлено ниже)

Я запускаю это на Vista, 64Bit, если это имеет значение.

Спасибо за любые указатели.

<?xml version="1.0" encoding="utf-8"?>
<assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity name="TestRegFreeCom.exe" version="1.0.0.0" processorArchitecture="x86" type="win32" />
  <file name="TestProject.dll" asmv2:size="20480">
    <hash xmlns="urn:schemas-microsoft-com:asm.v2">
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>uIK8e9FAnH4SQwk6PRfrjdZHWuw=</dsig:DigestValue>
    </hash>
    <typelib tlbid="{08dcd362-63a1-424a-8c4e-e72dcda2a8e2}" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
    <comClass clsid="{c540c43a-4d80-4c87-9091-dff664df0021}" tlbid="{08dcd362-63a1-424a-8c4e-e72dcda2a8e2}" progid="TestProject.Testy" />
  </file>
</assembly>

Ответы [ 3 ]

2 голосов
/ 29 декабря 2008

Если вы ссылаетесь на DLL в вашем приложении, щелкните по ссылочной dll под ссылками в вашем проекте, посмотрите на свойства и установите для параметра Isolated значение TRUE.

Это будет включать .dll в вашем проекте, и ваше приложение будет использовать копию .dll, включенную в ваш проект.

Чтобы увидеть рабочий пример этого взгляда здесь:

http://archive.msdn.microsoft.com/SEHE

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

2 голосов
/ 25 ноября 2008

Ваш пример кода представляется манифестом для DLL-библиотеки COM-объектов. У вас тоже есть манифест для основной программы? Ему нужен тот, который перечисляет другой объект как зависимость.

В , отвечая на предыдущий вопрос по этой теме , мой тест был программой на C #, которая использовала старый элемент управления ActiveX, поставляемый с VB5 / VB6. Манифест для моей основной программы выглядел так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
<assemblyIdentity
            type = "win32"
            name = "client"
            version = "1.0.0.0" />
<dependency>
            <dependentAssembly>
                        <assemblyIdentity
                                    type="win32"
                                    name="MSFLXGRD.X"
                                    version="6.1.97.82" />
            </dependentAssembly>
</dependency>
</assembly>

Атрибут name в элементе variableAssembly / assemblyIdentity должен совпадать с атрибутом в манифесте для библиотеки DLL COM. Как вы можете видеть здесь, это не обязательно должно быть реальное имя файла.

Другая возможная проблема, которую я вижу, заключается в том, что в манифесте нет элемента comInterfaceExternalProxyStub. Образец этого тега и пошаговое руководство о том, что еще нужно сделать, находится в этой статье на MSDN: Без регистрации активации COM-компонентов: пошаговое руководство . Шаги 6 и 7 говорят о создании двух манифестов.

0 голосов
/ 26 ноября 2008

Спасибо за ответ.

Манифест, который я добавил, генерируется автоматически из консольного приложения .NET. Манифест не создается для самой библиотеки DLL. Я проверю прохождение и посмотрим, даст ли это какие-либо ответы.

...