help: Вызовите C # winforms dll из проекта VB6? - PullRequest
2 голосов
/ 17 декабря 2009

У меня есть проект VB6 (приложение Windows), и я должен перестроить модуль в существующем проекте VB6 в C # .net.

Модуль, который я разрабатываю на C # .net, должен быть dll и содержать несколько оконных форм. Мне удалось успешно вызвать dll консоли приложения c # из моего проекта vb6, но у меня возникают проблемы, когда я пытаюсь вызвать библиотеку классов C # с winforms из моего проекта VB6.

Это то, что я сделал для моего доказательства концепции - это файл класса в моем проекте библиотеки классов C # .net.

namespace TestDll
{
    public interface IClass1
    {
        void DisplayMessage();
    }


    public class Class1:IClass1
    {              
        void IClass1.DisplayMessage()
        { 
            MessageBox.Show ("Displyaing message");
        }

    }
}

У меня есть форма в том же nemspace, и я планирую создать экземпляр Class1 и использовать ее объект в событии page_load в winform C #.

В моем проекте VB6 я хочу отобразить форму, которую я имею в моей C # .net dll. Я называю это этим кодом -

Private Declare Sub DislayMessage Lib "TestDll.dll" ()

Private Sub Command1_Click() //On button click event of the VB6 windows form
DislayMessage
End Sub

Я получаю сообщение об ошибке - «Не удается найти точку входа DLL в DisplayMessage в TestDll.dll»

Я не уверен, как решить эту ошибку. Я даже скептически отношусь к тому, что именно так Cll .net dll, который содержит некоторые winforms, должен вызываться из приложения Windows VB6.0.

Должен ли я создать экземпляр Class1 в своем коде VB6? Как мне решить эту ошибку? Мой подход правильный? Есть ли лучшие способы сделать это?

ТИА.

Ответы [ 3 ]

4 голосов
/ 17 декабря 2009

Вы должны сделать свой класс COM-Visible. Вот как бы я изменил ваш код:

namespace TestDll
{
    [Guid("FB8AB9B9-6986-4130-BD74-4439776D1A3D")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface IClass1
    {
        [DispId(50)]
        void DisplayMessage();
    }


   [Guid("74201338-6927-421d-A095-3BE4FD1EF0B4")]
   [ClassInterface(ClassInterfaceType.None)]
   [ComVisible(true)]
   [ProgId("TestDll.Class1")]
    public class Class1:IClass1
    {              
        void IClass1.DisplayMessage()
        { 
            MessageBox.Show ("Displyaing message");
        }

    }
}

Обратите внимание на [DispId(50)]. Вы хотите указать идентификатор отправки для ваших COM-видимых методов, свойств и событий. Если вы этого не сделаете, компилятор сделает это за вас, и вы можете в конечном итоге нарушать совместимость при каждой компиляции. Число не имеет большого значения, так как оно не меняется между компиляциями.

Возможно, вы захотите проверить Создание COM-объектов в C # . Это очень хорошее руководство по началу работы.

Некоторые основные моменты:

Предоставление объектов VC # для COM мир требует следующего ...

* The class must be public
* Properties, methods, and events must be public.
* Properties and methods must be declared on the class interface.
* Events must be declared in the event interface.

Каждый интерфейс нуждается в свойстве GUID установить перед именем интерфейса. к создать уникальный Guid, используйте guidgen.exe и выберите Формат реестра.

2 голосов
/ 17 декабря 2009

Единственный способ сделать это - представить ваш класс C # как объект COM (также называемый CCW - COM Callable Wrapper) и создать экземпляр этого объекта COM в вашем коде VB6.

Это должно помочь вам начать:

http://www.bing.com/search?q=C%23+CCW&go=&form=QBRE&qs=n

0 голосов
/ 17 декабря 2009

Здесь есть отличная помощь по MSDN:

http://msdn.microsoft.com/en-us/library/6bw51z5z.aspx

...