Reg Free Com с VB6 на Windows 7 - PullRequest
       47

Reg Free Com с VB6 на Windows 7

16 голосов
/ 30 декабря 2010

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

Например, скажем, что мои 2 .NET сборки - Some.Assembly.A.dll и 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 это удается. Если я намеренно ошибаюсь в написании зависимой сборки в VB6.EXE.manifest - на XP я получаю

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

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

Ответы [ 8 ]

1 голос
/ 24 февраля 2011

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

1 голос
/ 12 февраля 2011

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

1 голос
/ 28 января 2011

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

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

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

Удачи!

1 голос
/ 10 января 2011

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

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

0 голосов
/ 20 февраля 2011

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

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

0 голосов
/ 14 февраля 2011

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

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

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

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

0 голосов
/ 08 января 2011

Из этого блога

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

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

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

0 голосов
/ 01 января 2011

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

...