DotNet COM из VB6 без строгого имени

#c# #.net #com #vb6

#c# #.net #com #vb6

Вопрос:

У меня есть сборка адаптера c # вокруг неподписанной сторонней сборки, поэтому я также не могу подписать свою сборку. Моя сборка адаптера должна использоваться программой VB6 для доступа к функциям сторонней сборки, которая не является COM. Однако, хотя я могу зарегистрировать сборку с помощью regasm, сгенерировать файл tlb и ссылаться на него в VB6, я получаю исключение ActiveX при попытке установить для моей переменной Dimmed значение нового экземпляра моего адаптера.

У меня есть соответствующий .Установлены Net framework, и я могу запустить мою сборку адаптера из командной строки через другой исполняемый файл .Net на компьютере, на котором установлен VB6.

Вот как я настраиваю свой COM, без ссылки на стороннюю ссылку .. на всякий случай, если это проблема..

     [ComVisible(true)]
    [Guid("F728D70E-ED98-456C-B8C6-4EA5B0EF8A1A")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("SimpleComClass452.MySimpleComClass")]
    public class MySimpleComClass : _MySimpleComClass
    {

        public int Add(int num1, int num2)
        {
            return num1   num2;
        }
    }
 
     [ComVisible(true)]
    [Guid("C729E6FF-C2F5-4C9B-8200-A135E15576A6")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface _MySimpleComClass
    {
        [DispId(1)]
        int Add(int num1, int num2);
    }

 

Как я могу разобраться в проблемах с доступом к моей сборке адаптера с поддержкой .NET COM из VB6? Я смотрел на procmon, но ничего не вижу.
Есть ли какой-либо способ выяснить, в чем заключаются проблемы?

Комментарии:

1. Имеют ли c # dll и код vb6 одинаковую разрядность? Например, 32-разрядный код не может использовать 64-разрядный COM-объект

2. Какую ошибку вы получаете в VB6?

3. Строгое именование AFAIK вообще не влияет на COM-взаимодействие VB6. По крайней мере, я выполняю много COM-взаимодействий (VB6 вызывает C #) и ничего не подписываю.

4. Можете ли вы опубликовать код VB6 и конкретно указать, какая строка выдает вам какую ошибку?

5. IIRC, если вы хотите установить свою сборку COM-взаимодействия в GAC, то у нее должно быть строгое имя. Но если вы просто зарегистрируете его повторно, вы сможете создать его экземпляр. Когда вы запускаете IDE, вам может потребоваться поместить копию вашей сборки в ту же папку, что и vb6.exe (обычно C:Program FilesMicrosoft Visual StudioVB98).

Ответ №1:

@Renat назвал это в комментариях к исходному сообщению.

Перекомпилирован в VS2019 как явно 32-разрядный и заменен на использование x86 regasm в C:WindowsMicrosoft.NetFrameworkregasm.exe на целевой машине.

Я использую 64-разрядную ОС (Windows 2012 r2) для запуска VB6 на целевой машине, но она все равно будет компилироваться в сборку x86.

Так что я предполагаю, что урок — x86 для VB6, но я думаю, вы все это и так знали: S