我有VS 2015,想要创建一个从VBA调用的VB.NET DLL。
当我尝试编译并获取DLL时,我得到“无法编写汇编:访问被拒绝,请确保您拥有管理员权限”(近似翻译)==>编译错误
但是,令人惊讶的是,DLL确实已创建,但无法从VBA链接。
我怎么能这样做?我无权访问管理员权限,工作空间限制......
我试过了:
https://msdn.microsoft.com/en-us/library/ms973913.aspx ==> “服务器”再次需要管理员权限......
直接关注微软教程==> “com interop”需要管理员权限,如上所述
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”的生成 - 失败。
答案 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)