2013-07-22 3 views
0

Я конвертирую приложение VB6 в C# .net и работаю над общими дополнениями. При нажатии кнопки в MS Word я хочу открыть свое приложение, потому что я создаю объект такого класса.Interaction.CreateObject, создающий старый объект

objApp = Interaction.CreateObject("DocSys.Application"); 

, но эта строка кода всегда возвращает старый instace приложений vb6 в то время как я добавляя refrance из .net проекта. что я должен сделать, чтобы получить .net-объект.

+0

Прошло некоторое время с тех пор, как я перепутал с VB6 и его поддержкой COM, но, возможно, это имеет какое-то отношение к таблице запущенных объектов, где зарегистрированы экземпляры общих программ? Попытайтесь это прочитать. http://stackoverflow.com/questions/11835617/understanding-the-running-object-table –

+0

@ Shahar-Kashtan Я полностью ушел от этой концепции, пожалуйста, помогите мне, что я делаю. –

ответ

1

Существует не один способ пошатнуть это. Например, забудьте сделать свой интерфейс и классы [ComVisible (true)]. Или забыть зарегистрировать COM-сервер, явно сделанный с помощью Regasm.exe/codebase/tlb. Или используя неправильную версию Regasm.exe, в 64-битной версии будут записаны неправильные ключи реестра.

Что более важно для CreateObject(), атрибут [ProgId] в вашем классе C# необходим, чтобы обеспечить точную замену сервера VB6. Если код клиента когда-либо использовал раннее связывание, важно, чтобы атрибут [Guid] на ваших интерфейсах и классах был точным совпадением с листами, используемыми сервером VB6. И, конечно же, методы и свойства должны точно соответствуют тем, которые используются сервером VB6, заказ также очень важен.

Лучший способ сравнить оранжевый с яблоком - использовать утилиту Oleview.exe. Запустите его из командной строки Visual Studio и используйте File + View Typelib. Сначала выберите свой сервер VB6. Скопируйте/вставьте IDL, который вы видите в текстовом файле, и сохраните его, поэтому вам не нужно делать это повторно.

Запустите tlbexp.exe на сборке C#, чтобы создать библиотеку типов для вашего сервера C#. Запустите Oleview.exe снова и выберите файл .tlb. Теперь вы можете сравнить IDL для своего сервера с сервером VB6. Убедитесь, что вы получаете точное совпадение с подсказками, методами и свойствами.


И последнее, но не в последнюю очередь, если клиентский код фактически использует Interaction.CreateObject(), то это приложение .NET. Это означает, что вам не следует создавать COM-совместимый COM-сервер вообще. Это должна быть обычная сборка .NET, просто добавьте ссылку на нее и напрямую используйте открытый класс.

Смежные вопросы