2009-12-17 108 views
2

我有一個VB6項目(Windows應用程序),我不得不在C#.net的現有VB6項目中重新開發一個模塊。help:從VB6項目調用C#winforms dll?

我在C#.net中開發的模塊應該是一個dll,並且應該包含一些窗體。我能夠從我的vb6項目成功調用c#控制檯應用程序DLL,但是當我嘗試從我的VB6項目調用帶有winforms的C#類庫時,我遇到了問題。

這就是我爲我的概念證明所做的 - 這是我C#.net類庫項目中的一個類文件。

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


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

    } 
} 

我在同一nemspace一個形式,我打算實例Class1和使用它的物體上的C#的winform的Page_Load事件。

在我的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 

我得到一個錯誤 - 「在TestDll.dll找不到在DisplayMessage一個DLL入口點」

我不知道如何解決這個錯誤。我甚至懷疑,如果這是包含一些winforms的C#.net dll應該從VB6.0窗口應用程序調用的方式。

我應該在我的VB6代碼中實例化Class1嗎?我如何解決這個錯誤? 我的方法是否正確?有沒有更好的方法來做到這一點?

TIA。

回答

3

你必須讓你的類COM可見。以下是我會改變你的代碼:

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可見方法,屬性和事件指定分派ID。如果你不這樣做,編譯器會爲你做,並且你最終可能會在每次編譯時打破兼容性。編號無關緊要,因爲它在編譯之間不會改變。

你可能想看看Building COM Objects in 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

這樣做是爲了使您的C#類作爲COM對象(也稱爲CCW - COM可調用包裝)的唯一途徑,並在VB6的代碼創建一個COM對象的實例。

這應該幫助您開始:

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

+1

好吧,不是*唯一*的方式來做到這一點,但唯一的*理智*的方式來做到這一點:-P – Brannon 2009-12-17 09:40:11

+0

THANKs。這非常有幫助。 但是,我仍然好奇。你能告訴我上面發佈的代碼有什麼問題嗎? – pavanred 2009-12-17 10:50:16

+0

C-Pound Guru很好地總結了它。 – Brannon 2009-12-17 23:31:23