在没有管理员权限的情况下创建VB.NET DLL

时间:2016-10-24 10:38:17

标签: vb.net visual-studio dll

我有VS 2015,想要创建一个从VBA调用的VB.NET DLL。

当我尝试编译并获取DLL时,我得到“无法编写汇编:访问被拒绝,请确保您拥有管理员权限”(近似翻译)==>编译错误

但是,令人惊讶的是,DLL确实已创建,但无法从VBA链接。

我怎么能这样做?我无权访问管理员权限,工作空间限制......

我试过了:

VB.NET代码是虚拟的,用于检查链接:

Public Class main
    Public Function plus(x#) As Double
        plus = x + 1
    End Function
End Class

PS:错误:

1> C:\ Program Files(x86)\ MSBuild \ 14.0 \ bin \ Microsoft.Common.CurrentVersion.targets(4335,5):错误MSB3216:Impossible d'inscrire l'assembly“D:\ Full_Path \ bin \ Debug \ LibName.dll“ - accèsrefusé。 Assurez-vous quevousexécutezl'appintant qu'administrateur。 L'accèsàlaclédeRegistre'HKEY_CLASSES_ROOT \LibName.main'estrefusé。

1>ExécutiondelaTâche“RegisterAssembly”terminée - ÉCHEC。

1>Générationdela cible“UnmanagedRegistration”terminéedansle projet“LibName.vbproj” - ÉCHEC。

翻译:

1> C:\ Program Files(x86)\ MSBuild \ 14.0 \ bin \ Microsoft.Common.CurrentVersion.targets(4335,5):错误MSB3216:无法编写程序集“D:\ Full_Path \ bin \ Debug \ LibName.dll“ - 访问被拒绝。确保以管理员身份运行应用程序。对注册表项“HKEY_CLASSES_ROOT \ LibName.main”的访问被拒绝。

任务“RegisterAssembly”的执行完成 - 失败。

在项目“LibName.vbproj”中完成任务“UnmanagedRegistration”的生成 - 失败。

1 个答案:

答案 0 :(得分:2)

Maby这对你有所帮助: 要使您的VB.NET类库可从VBA项目访问,请使用<System.Runtime.InteropServices.ComVisible(True)> - 属性标记您的类。

在您的VBA项目中,添加以下参考:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb (Common Language Runtime Execution Engine 2.4 Library)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb

在您的VBA代码中(“导入”图书馆):

Sub DLLTest()
    ' You need this to execute functions of the CLR
    Dim clr As mscoree.CorRuntimeHost

    ' Offers you the ability to load functions from the DLL
    Dim domain As mscorlib.AppDomain

    ' Variable to store a instance of your class
    Dim objTest As Object

    ' Create a new RuntimeHost
    Set clr = New mscoree.CorRuntimeHost

    ' Start the RuntimeHost
    clr.Start

    ' Get the default AppDomain
    clr.GetDefaultDomain domain

    ' Create a instance of your DLL class
    ' dll_path is the path pointing to the DLL (can be UNC path)
    Set objTest = domain.CreateInstanceFrom(dll_path, "main").Unwrap

    ' Test 
    Dim result As Double
    result = objTest.plus 1

    ' Delete the reference
    Set objTest = Nothing

    ' Stop the RuntimeHost 
    clr.Stop
End Sub

信用:

我从这里得到了代码:https://www.vb-paradise.de/index.php/Thread/87001-NET-Dll-in-VBA-ohne-COM-Registrierung-nutzen/

编辑: 在这里,这段代码在我的电脑上运行

Imports System.Runtime.InteropServices

<ComVisible(True)>
Public Class Main
    Public Function Add(value As Double) As Double
        Return value + 1
    End Function
End Class

目标框架.NET Framework 3.0

VBA的编辑: 添加了对*.tbl文件的引用并使用了以下代码:

Sub DLLTest()
    ' You need this to execute functions of the CLR
    Dim clr As mscoree.CorRuntimeHost

    ' Offers you the ability to load functions from the DLL
    Dim domain As mscorlib.AppDomain

    ' Create a new RuntimeHost
    Set clr = New mscoree.CorRuntimeHost

    ' Start the RuntimeHost
    clr.Start

    ' Get the default AppDomain
    clr.GetDefaultDomain domain

    ' Variable to store a instance of your class
    Dim objTest As Object

    ' Create a instance of your DLL class
    ' dll_path is the path pointing to the DLL (can be UNC path)
    Set objTest = domain.CreateInstanceFrom("C:\TestDll.dll", "TestDll.Main").Unwrap()

    ' Test
    Dim result As Double
    result = objTest.Add(1)
    MsgBox result

    ' Delete the reference
    Set objTest = Nothing

    ' Stop the RuntimeHost
    clr.Stop
End Sub

将dll文件放在C:\上 将其与按钮组合在按下后,会出现一个消息框,告诉我结果(输入+ 1)