Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在excelvba中使用c#class?_C#_Vba_Excel - Fatal编程技术网

如何在excelvba中使用c#class?

如何在excelvba中使用c#class?,c#,vba,excel,C#,Vba,Excel,我有一个独立的c#应用程序,它可以做一些特定的事情(监听TCP端口并通过语音合成器发出所有到达它的字符串的声音)。如何使c#类对VBA程序可见,就像其他“引用”对它可见一样?我希望能举一个简短明了的例子。出于某种原因,我很难找到其中一个 如果有一些特定于c#vba交互的陷阱,我也想知道这些 这是一个C代码。我构建的是一个带有“注册COM互操作”设置的类库。 当我将生成的.tlb文件添加到VBA引用列表中时,我希望看到SayCom库中有SayCom类,它有两个方法:square和getCount。

我有一个独立的c#应用程序,它可以做一些特定的事情(监听TCP端口并通过语音合成器发出所有到达它的字符串的声音)。如何使c#类对VBA程序可见,就像其他“引用”对它可见一样?我希望能举一个简短明了的例子。出于某种原因,我很难找到其中一个

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

这是一个C代码。我构建的是一个带有“注册COM互操作”设置的类库。 当我将生成的.tlb文件添加到VBA引用列表中时,我希望看到SayCom库中有SayCom类,它有两个方法: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;
            }
        }
    }

据我所知,唯一的“问题”是你的C#代码需要修改。您应该能够按照以下步骤将C#代码作为.dll导入到VB应用程序中。免责声明:我自己没有尝试过

编辑:这涉及到从.dll调用函数。

这对我很有用

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;
            }
    }
}

我以前看过其中一些页面。我甚至不确定它们是否与我的问题有关。他们似乎在谈论不同.NET语言之间的互操作性和共享类。我需要的是能够将C#.NET与非.NET VBA进行接口。对,所以您主要关心通过TCP/IP发送字符串,对吗?我假设您当前的应用程序有一个相对顶级的函数,它接受字符串并传输它。因此,您需要将应用程序构建为.dll,然后将其“导入”到VB应用程序中。然后,您可以查看我在回答中发布的第三个链接,以帮助您理解如何从.dll调用顶级函数并传递适当的字符串。好的,我的问题是如何创建VBA可见的C#类。我更希望它是一个“类型库”,因此方法名和类型名可以通过vba IDE看到,但如果失败或证明太困难,我可以满足于使用简单的DLL并使用vba的“Import”语句调用DLL。到目前为止,我在这两方面都没有任何进展。无论我在C#项目中选择什么设置或编写什么代码,结果都无法从VBA中使用。主要问题是在VBA中使用C#类。我提到在TCP/IP中发送字符串是为了提供一些上下文。我现在明白了,这可能会让人困惑。我投票决定重新打开它,因为现在你想要什么已经很清楚了。快速提问。你明白了吗<代码>项目设置|应用程序|装配信息|使装配COM可见(设置为打开)|生成|注册COM互操作(设置为打开)我没有执行零件装配信息|使装配COM可见。我现在做了,但仍然没有看到班级。我看到了图书馆的SayCom,但里面什么都没有。很抱歉这么晚才回复,但我刚刚醒来:p我已经发布了一个答案。它对我也很有用,谢谢。一个小问题:我不得不以管理员的身份重新启动VisualStudio,因为它在构建过程中无法更新注册表。