COM-библиотека AnyCPU (файл .tlb) не работает при вызове из внешнего макроса VB6 в x64

Хорошо, мой заголовок может быть недостаточно ясным. Я работаю с приложением, для которого мы можем разработать макросы VB6. Этот макрос должен работать с библиотекой .NET, которую я также разработал. Когда я запускаю приложение в режиме x86 и пытаюсь запустить макрос, он работает нормально, я могу получить доступ к методам класса и всему остальному.

Но когда я делаю то же самое в режиме x64, я получаю сообщение об ошибке: "Automation server can't create object"

Что действительно странно, так это то, что я не использую какие-либо неуправляемые библиотеки COM x86, что было бы проблемой для архитектуры x64. Когда я это делаю: "Dim myClass as new MyClass.App" он работает, но когда я вызываю, например, метод myClass.Start(), я получаю эту ошибку. И я попробовал просто использовать MsgBox('hello world') в моем Start методе, чтобы убедиться, что он не имеет ничего общего с моим кодом, но все равно не повезло. Я связываю свой макрос со своим классом с помощью TLB файла.

Я попытался зарегистрировать свою DLL в RegAsm, но она все еще не работает в x64. Есть ли способ сгенерировать как x86, так и x64 версии моего TLB? Затем я бы добавил обе ссылки, и если версия x64 выдает ошибку в методе Start, я просто вызываю метод x86 (не идеальное решение, но все же ..).

Есть идеи, как решить эту проблему?


person Thierry Mathez    schedule 13.11.2014    source источник
comment
Используйте 64-битную версию Regasm.exe   -  person Hans Passant    schedule 14.11.2014
comment
Почему вы удалили свой ответ? Как я уже сказал, я использовал 64-битную версию RegAsm / .NET 4.0, но все равно получаю эту ошибку ...   -  person Thierry Mathez    schedule 14.11.2014


Ответы (1)


Как сказал Ганс, мне нужно было использовать 64-битную версию Regasm.exe. Хотя я уже пробовал запустить RegAsm вручную после установки, он не работал. Сначала я добавил это в событии после сборки моего проекта:

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" "$(TargetPath)"

Это помогло в отладочной версии. Что странно, версия AnyCPU сначала работала нормально в моем приложении x64, в режиме отладки она начала давать сбой, когда я создал свой установочный проект (не знаю почему ...). Но это изменение не решает мою проблему при установке приложения, поэтому я добавил это в «Зафиксировать» своего настраиваемого действия (на основе этой статьи: Regasm- 64-битный или 32-битный, хотя установщик Windows в Visual Studio):

   Public Overrides Sub Commit(savedState As System.Collections.IDictionary)
        MyBase.Commit(savedState)

        'Check if we're on a x64 OS
        If Environment.Is64BitOperatingSystem Then
            'Get the Windows dir on the current computer
            Dim winDir As String = New IO.DirectoryInfo(Environment.SystemDirectory).Parent.FullName

            'Define the path to regasm for x64 machines
            Dim regasmPath As String = IO.Path.Combine(winDir, "Microsoft.NET", "Framework64", System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion, "RegAsm.exe")

            If File.Exists(regasmPath) Then 'Si le chemin existe, on enregistre la DLL
                'Get the location of our DLL
                Dim componentPath As String = GetType(Installer).Assembly.Location

                'Executes regasm
                System.Diagnostics.Process.Start(regasmPath, "/codebase """ & componentPath & """")
            End If
        End If
    End Sub

То, что я изменил по сравнению с исходной статьей, - это путь к RegAsm. Поскольку моя установка - x86, каталог RuntimeEnvironnment указывал на путь «Microsoft.NET \ Framework ...», а не на «Framework64», который противоречил цели моего действия (он уже был зарегистрирован как 32-битное COM-взаимодействие), поэтому я пытаюсь получить 64-разрядную версию RegAsm и запустить ее.

person Thierry Mathez    schedule 19.11.2014