2010-09-28 61 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