关于.net:Intellisense无法检测vb.net创建的dll中的功能

Intellisense can't detect functions in vb.net created dll

我认为答案很简单,但我似乎找不到直接的答案。我可以看到很多有关该主题的内容,但是没有什么可以解决的(请参见下文,我可以找到最接近的答案)

我已经使用vb.net创建了一个.dll,并将其导入以便可以在Excel中使用没有问题。当我dimset此类的实例时,intellisense会选择库和类的名称,但是从那里不会显示函数/变量或子例程的名称。例程和变量可以编译并完全正常运行,但我希望该库对其他用户可用,因此intellisense将非常有帮助。

VB.net中的示例代码:

1
2
3
4
5
6
7
8
Namespace wtf
    Public Class samplerJam
        Public jjj As String
        Public Sub method1()
            jjj ="Hello"
        End Sub
    End Class
End Namespace

我错过了一些非常简单的东西吗?

(找到了类似问题的答案,但根据该设置,我应该能够看到我的子菜单/功能)


这对于聚会来说可能有点晚了,但是我在尝试解决VB.NET中的类似问题时偶然发现了这个问题,因此希望这可以对您/某人有所帮助。

智能感知

就解决智能感知方面而言,您的原始答案将起作用。但是我的方法涉及使用GUID。

比方说,我有一个名为Foo的类,我想将其公开给Excel / Access。我将创建一个由Foo-

实现的Interface

1
2
3
4
5
6
7
8
9
10
11
Public Interface IFoo
    Function HelloWorld() As String
End Interface

Public Class Foo
    Implements IFoo

    Public Function HelloWorld() As String Implements IFoo.HelloWorld
        Return"Hello World!"
    End Function
End Class

如您所见,Foo具有一个称为HelloWorld的函数,该函数在接口中声明,并已实现到该类中。

因此,现在,为了确保在智能感知中获得此信息,我们可以向接口/类添加一些属性以将其公开给Excel。我的界面更改如下-

1
2
3
4
5
6
<ComVisible(True)>
<Guid("2055A907-9D7A-4DC9-A46B-6E283713A5AB")>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
Public Interface IFoo
    Function HelloWorld() As String
End Interface

我的班级将更改为-

1
2
3
4
5
6
7
8
9
10
11
<ComVisible(True)>
<Guid("2C4D41A7-235E-4F48-BE99-62118B2852A7")>
<ClassInterface(ClassInterfaceType.None)>
<ProgId("Foo")>
Public Class Foo
    Implements IFoo

    Public Function HelloWorld() As String Implements IFoo.HelloWorld
        Return"Hello World!"
    End Function
End Class

要生成GUID,可以在Visual Studio中使用一些简单的步骤。工具>创建GUID> VB.NET的选项6或C#的5

您的DLL现在可以与intellisense一起使用了!

在目标机器上注册

电源shell

此过程是手动的,如果您在蓝月亮中执行一次/只有一台目标计算机超出您自己的目标计算机,就可以了。

您要查找与用于生成DLL的.NET版本相对应的.NET文件夹。假设您至少使用.NET 4.0,它将在此处-

C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\

您需要使用Regasm来注册dll。

1
2
3
cd C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\
.\
egAsm.exe PathToYourDLL\\DLLName.dll

请注意,如果您的路径包含空格,请在文件路径周围使用"引号"

创建一个MSI

如果您有一些目标计算机,则创建MSI为您执行注册可能会更容易。

您可以从Microsoft Marketplace(https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects)下载扩展,并生成MSI / EXE以完成注册。

关于如何使用此扩展名创建安装向导的教程很多,默认情况下,VS会在您的dll上设置属性以在安装过程中为您注册这些属性


仔细研究了一些C#内容(关于这个主题的VB.net并不多)之后,我找到了答案,我需要在类声明的前面加上这个<ClassInterface(ClassInterfaceType.AutoDual)>以便于:

1
2
3
4
Namespace wtf
    <ClassInterface(ClassInterfaceType.AutoDual)> Public Class samplerJam
        Public jjj As String
''' etc