Подтвердить что ты не робот

Reg Free Com с VB6 на Windows 7

У меня есть код .NET, который я использую из кода VB6. Я всегда разрабатывал это на машине XP, создав файл VB6.exe.manifest, в котором перечислены зависимые сборки .NET.

Например, скажем, что мои 2 сборки .NET - это Some.Assembly.A.ll и Some.Assembly.B.dll, вот что выглядит VB6.EXE.manifest(я использую версию = 1.1.0.0 ниже, потому что это это версия, установленная в .NET AssemblyVersion в AssemblyInfo.cs):

<?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.1.0.0" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.A"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.B"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
</assembly>

Затем вместе с DLL в том же каталоге у меня есть сборки и их собственные файлы манифеста. Вот пример "Some.Assembly.A.dll.manifest":

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
  <assemblyIdentity
      type="win32"
      name="Some.Assembly.A"
      version="1.1.0.0" />
  <clrClass
      clsid="{F1234567-1234-1234-1234-123456789012}"
      progid="Some.Assembly.A.Class1"
      threadingModel="Both"
      name="Some.Assembly.A.Class1" >
  </clrClass>
  <file name = "Some.Assembly.A.dll" />
</assembly>

Я также запускаю tlbexp в связанных DLL файлах для создания файлов TLB, и это то, что я упоминаю в файле проекта VB6.

Я хочу перейти на машину Windows 7 64 BIT. Используя те же методы, когда я ударил код VB6, который создает экземпляр объекта .NET на машине WIN7, я получаю

"Компонент ActiveX не может создать Объект".

В XP это удается. Если я намеренно ошибочно назову сборку Dependent в VB6.EXE.manifest - на XP я получаю

"Это приложение не удалось запустить потому что конфигурация приложения это неверно. Переустановка приложение может решить эту проблему."

В WIN7, VB6 просто загружается. Он как будто игнорирует манифест на WIN7, поэтому я не могу загрузить свой .NET-объект, используя REG FREE-методы на WIN7. Если я regasm DLL, все работает.
Любые идеи о том, как заставить VB6 работать с reg free com на WIN7 (64 BIT)?

4b9b3361

Ответ 1

Вы пытались просто установить и запустить VB6 в режиме совместимости с WinXP?

Ответ 2

Если вы перекомпилируете vb6.exe или иным образом обработаете его для машины win7, вы должны знать, что некоторые из новых средств разработки автоматически вставляют манифест, чтобы вы могли проверить это (быстрый способ - открыть исполняемый в VS, и найдите ресурс RT_MANIFEST с идентификатором 1). Если есть встроенный манифест, внешние манифесты игнорируются, что, возможно, поэтому, когда вы редактируете внешний manfiest, ничего не происходит, и его содержимое игнорируется.

Кроме того, что сказал Эрно о sxstrace (можете ли вы опубликовать результаты, полученные из sxstrace?), обязательно обновите метку времени VB6.exe, если манифест встроен в нее, или VB6.exe.manifest в противном случае. Vista + Win7 кэширует содержимое манифестов, выбирая метку времени корневого манифеста, чтобы ваши локальные изменения не могли получить. Если sxstrace дает вам пустые результаты, обновите метки времени и повторите попытку.

Ответ 3

Первое, что приходит на ум, - это то, что стоит попробовать подписать код .net. Может быть, что неявно какой-то более высокий уровень безопасности применяется к 64-битной версии win7, для которой требуются подписанные ссылки на сборку.

Кроме того, вы можете попытаться сузить проблему (в определенном порядке)

  • отметьте программу для запуска в качестве администратора и повторите попытку.
  • отметьте программу для запуска в режиме совместимости xp/win2k
  • запустите его в dependencywalker (у него есть возможность имитировать загрузку программы и регистрировать ошибки)

Удачи!

Ответ 4

Я делал эту гибридную отладку на днях и получил ошибку: "Компонент ActiveX не может создать объект". Я предлагаю вам следовать этой статье Отладка гибридных приложений Visual Basic 6.0/Visual Basic.NET и убедитесь, что на вашем ПК Win7 работает пример с пустыми костями (я его reaalise работает с regasm). Затем с битом REG FREE я исследовал следующие ссылки: .NET Object из VB6 без использования regasm.exe? и здесь Автоматическая активация компонентов на основе .NET: шаг за шагом

Ответ 5

Вы можете попробовать использовать /win32 вариант tlbexp на ОС x64.

Ответ 6

От этот пост в блоге

вы можете использовать SxsTrace, чтобы помочь отладить проблему. Чтобы запустить трассировку "SxsTrace Trace -logfile: SxsTrace.etl", чтобы преобразовать файл журнала в то, что вы можете просмотреть, запустите "SxsTrace Parse -logfile: SxsTrace.etl -outfile: SxsTrace.txt".

Вы пробовали это?

Другое дело, что в Vista/Windows 7 вы можете легко запустить UAC, проверяете ли вы это?

Ответ 7

Regasm делает намного больше, чем просто генерирует TLB или необходимые ключи реестра.

Например, он может создавать видимые интерфейсы COM, основанные на видимых COM-типах. Regasm будет делать это, когда видимый тип COM не реализует интерфейс, например.

Есть ли у вас какие-либо видимые типы COM, которые не реализуют интерфейс (или не определяют интерфейс COM с помощью ComDefaultInterfaceAttribute)?

Если это так, это может быть вашей проблемой.

Ответ 8

Я смог успешно использовать классы .Net от VB6 в Win 7-64, используя манифесты, созданные Side by Side Manifest Maker. У него есть бесплатная пробная версия.

Не забудьте включить версию времени исполнения .Net, на которую нацелены ваши классы. Это может быть вашей проблемой, поскольку Win 7 поставляется с предустановленным профилем клиента .Net 4.