2010-09-28 65 views
2

背景:我們有一個用C#編寫的COM對象。我們正在與另一家使用VB6編寫代碼的公司合作。我們需要發送VB6代碼來創建和調用COM對象中的對象/方法。如何在VB6中的COM .tlb文件中引用對象和方法?

我使用Microsoft提供的RegAsm.exe從C#COM DLL文件創建了一個.tlb文件。然後我在VB6中添加了這個.tlb文件作爲參考(Project-> References-> Browse ...)。它也在可用引用下進行檢查。它沒有註冊爲COM +。

我用這篇文章(C#/VB6 COM Example)作爲所有這些的參考。

問題:的問題是,我引用我的VB6項目這個COM對象,但沒有對象/方法/命名空間出現。我一定有一些簡單的東西,但它是什麼?我是否需要將此註冊爲COM +,還是其他問題?

編輯:關於項目
OK更多信息,所以我現在可以訪問源代碼,但顯然我錯了。它使用C++而不是C#。我們的C++ COM對象測試應用程序是用C#編寫的,但COM對象本身是C++。

現在,我的新問題是如何與此C++ DLL接口。我的大學提到它「不是一個真正的COM對象」,那麼除了將它作爲參考添加它之外,還有其他方法可以與之交互嗎?如果沒有,那我該如何把它變成一個COM對象?

我需要訪問和使用函數以及來自此DLL的對象。

+0

你在C#項目中的類上放置了ComVisible屬性嗎?在班上的任何方法? – 2010-09-28 17:38:26

+1

另一種檢查方法:使用對象資源管理器工具打開.tlb,看看裏面有什麼 – Rup 2010-09-28 18:19:35

+0

我是第二個Rup建議。查看在對象資源管理器工具下顯示的任何類。如果不是的話,請按照凱特的評論,並確保每個COM都可見。 – 2010-09-29 18:15:09

回答

2

這聽起來像你沒有適合你的C#類的接口...在C#中創建一個適當的typelib你需要爲你的對象創建一個接口。否則,該對象將出現在VB6中,就像您所描述的那樣:

即,

[Guid("0C3A05D1-ADF0-4d82-84BC-B59A1AEF6235")] 
public interface ISomeClass 
{ 
    [DispId(1)] 
    string Foo { get; } 

    [DispId(2)] 
    string Bar { get; } 

    [DispId(3)] 
    bool Baz { get; } 

} 

[Guid("59EA6033-9BF3-4123-B163-9AD1F958E179"), 
ProgId("SomeModule.SomeClass"), 
ClassInterface(ClassInterfaceType.None)] 
public class SomeClass : ISomeClass 
{ 

    public string Foo 
    { 
     get 
     { 
      return _foo; 
     } 
    } 
// More implimentation 
... 

有關更多詳細信息,請參閱此code project article

+0

添加了有關該問題的新信息。 – 2010-09-30 16:10:02

+0

它是C++還是C風格的DLL? C++ interop不是一個合適的Com DLL將會是一個嚴重的痛苦,但是。由於有很多方法可以與C++ dll交互,所以你不得不提供更多的細節,並且可能會提供一些C#測試代碼...... – 2010-09-30 18:30:08

+0

我不得不重新編寫在C#中的DLL,這很好。 – 2011-01-25 16:30:58