nun*_*bar 7 .net vba com-interop regfreecom registration-free-com
更新:在花了20多个小时尝试使一个简单的示例工作之后,我意识到这并不像看起来那样简单。诸如此类的文章揭示了“陷阱”-它是在Windows 7之前编写的(处理清单的方式有所不同)。我坚持通过VSTO将.NET程序集暴露给VBA 。
我制作了一个简单的COM-Visible .NET程序集,并试图从Excel VBA中调用它。如果我在.NET构建过程中“注册COM Interop”,则可以从VBA成功调用它。
Sub VBA()
Dim obj As Object
Set obj = actCtx.CreateObject("ComTest.Main")
MsgBox obj.Test() '<-- Displays "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,我想免注册。
根据汉斯的建议更新:
我取消选中``注册COM Interop'',然后将我的app.Manifest设置为:
Sub VBA()
Dim obj As Object
Set obj = actCtx.CreateObject("ComTest.Main")
MsgBox obj.Test() '<-- Displays "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)
我创建了一个虚拟的“ client.manifest”,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly
manifestVersion="1.0"
xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity
type="win32"
version="1.0.0.0"
name="ComTest"
publicKeyToken="a36a7110110d7bd7" />
<clrClass
clsid="{975DC7E0-4596-4C42-9D0C-0601F86E3A1B}"
progid="ComTest.Main"
threadingModel="Both"
name="ComTest.Main"
runtimeVersion="v4.0.30319">
</clrClass>
<file name = "ComTest.dll"></file>
</asmv1:assembly>
Run Code Online (Sandbox Code Playgroud)
创建对象时,我修改了VBA以使用client.manifest:
Sub VBA()
Dim actCtx As Object
Set actCtx = CreateObject("Microsoft.Windows.ActCtx")
actCtx.Manifest = "C:\Users\me\Desktop\COM Test\ComTest\ComTest\bin\Debug\client.manifest"
Dim obj As Object
Set obj = actCtx.CreateObject("ComTest.Main") '<-- Fails here.
MsgBox obj.Test()
End Sub
Run Code Online (Sandbox Code Playgroud)
它在CreateObject上失败,并显示错误信息Method 'CreateObject' of object 'IActCtx' failed。
sxstrace显示它读取client.manifest并创建激活上下文。进程监视器显示它访问ComTest.dll并在注册表中搜索类975DC7E0-4596-4C42-9D0C-0601F86E3A1B。
我想念什么?
这是.NET代码:
<ComVisible(True)>
<Guid("EB6AA207-ECC7-413B-9A9B-9D142FF2701D")>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
Public Interface IMain
Function Test() As String
End Interface
<ComVisible(True)>
<Guid("975DC7E0-4596-4C42-9D0C-0601F86E3A1B")>
<ProgId("ComTest.Main")>
<ClassInterface(ClassInterfaceType.None)>
<ComDefaultInterface(GetType(IMain))>
Public Class Main
Implements IMain
Public Function Test() As String Implements IMain.Test
Return "HELLO"
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
我正在运行64位Windows 7。