2014-02-19 58 views
3

我有一个独立的c#应用程序,它执行特定的任务(侦听TCP端口并发音通过语音合成器到达它的所有字符串)。如何让C#类对VBA程序可见,与其他“引用”对其可见的方式一样?我将不胜感激短而干净的例子。由于某种原因,我很难找到其中之一。如何在Excel VBA中使用c#类?

如果有一些特定于c#< - > vba交互的陷阱,我想知道这些。

这里是一个C#代码。我构建的是一个具有“Register for COM interop”设置的类库。 当我将生成的.tlb文件添加到VBA引用列表中时,我希望看到具有SayCom类的SayCom库有2个方法square和getCount。我没有看到。我错过了什么?

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Runtime.InteropServices; 

    [assembly: CLSCompliant(true)] 

    namespace SayCom 
    { 
     [CLSCompliant(true)] 
     [ComVisible(true)] 
     public class SayCom 
     { 
      int count; 

      public SayCom() 
      { 
       count = 0; 
      } 

      [ComVisible(true)] 
      public int square(int x) 
      { 
       ++count; 
       return x * x; 
      } 

      [ComVisible(true)] 
      public int getCount() 
      { 
       return count; 
      } 
     } 
    } 
+0

主要问题是在VBA使用C#类。我提到在TCP/IP中发送字符串以提供一些上下文。我现在看到这可能会让人困惑。 – nsg

+1

我已经投票表决重新开放,因为它现在很清楚你想要什么。快速提问。你遵循了这个吗? '项目设置|应用程序|组装信息|使组件COM可见(设置为ON)|构建|注册COM互操作(设置为ON)' –

+0

我没有做零件装配信息|使装配体COM可见。我现在做了,但还没有看到课堂。我看到图书馆SayCom,但它没有任何内容。 – nsg

回答

3

这对我的作品

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ClassLibrary1 
{ 
    [Guid("BBF87E31-77E2-46B6-8093-1689A144BFC6")] 
    [ComVisible(true)] 
    public interface MyMiniSubs 
    { 
     int square(int x); 
     int getCount(); 
    } 

    [Guid("BBF87E31-77E2-46B6-8093-1689A144BFC7")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class Class1 : MyMiniSubs 
    { 

     int count; 

     public Class1() 
      { 
       count = 0; 
      } 

      [ComVisible(true)] 
      public int square(int x) 
      { 
       ++count; 
       return x * x; 
      } 

      [ComVisible(true)] 
      public int getCount() 
      { 
       return count; 
      } 
    } 
} 

enter image description here

+0

它也适用于我,谢谢。一个小故障:我不得不重新启动Visual Studio作为管理员,因为它无法在构建过程中更新注册表。 – nsg

0

唯一的“疑难杂症”,据我所知,那是你的C#代码需要CLS compliant。您应该能够遵循the instructions here将您的C#代码作为.dll导入到您的VB应用程序中。免责声明:我自己没有尝试过。

编辑:Here's a more official MSDN reference谈论从.dll调用函数。

+0

我以前见过这些页面。我甚至不确定它们与我的问题有关。看起来他们正在谈论不同.NET语言之间的互操作性和共享类。我需要的是能够将C#.NET与非.NET VBA进行接口。 – nsg

+0

没错,所以你主要关心通过TCP/IP发送字符串,对吧?我假设你当前的应用程序有一个相对顶级的函数,它接受并传输字符串。因此,您需要将应用程序构建为.dll,然后将其“导入”到您的VB应用程序中。然后,您可以查看我在答案中发布的第三个链接,以帮助您了解如何从.dll调用顶级函数并传递适当的字符串。 – StephenH

+0

对,我的问题是我如何制作一个C#类,它对VBA是可见的。我更喜欢它作为“类型库”,所以方法名称和类型名称通过vba IDE可见,但如果失败或证明太困难,我可以使用“Import”语句调用简单的DLL并调用DLL 。到目前为止,我在两条战线上都取得了零进展。无论我选择什么设置或我在C#项目中编写代码,结果都无法在VBA中使用。 – nsg