Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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
.net 无法从VBA获取免注册COM_.net_Vba_Com Interop_Regfreecom_Registration Free Com - Fatal编程技术网

.net 无法从VBA获取免注册COM

.net 无法从VBA获取免注册COM,.net,vba,com-interop,regfreecom,registration-free-com,.net,Vba,Com Interop,Regfreecom,Registration Free Com,更新:在花了20多个小时试图让一个简单的示例生效后,我意识到这并不像看上去那么简单。文章揭示了“gotchas”——这是在Windows7之前写的(它以不同的方式处理清单)。我坚持将.NET程序集公开给VBA 我制作了一个简单的COM可见.NET程序集,并试图从Excel VBA调用它。如果我在.NET构建期间“注册COM互操作”,我可以从VBA成功调用它 Sub VBA() Dim obj As Object Set obj = actCtx.CreateObject

更新:在花了20多个小时试图让一个简单的示例生效后,我意识到这并不像看上去那么简单。文章揭示了“gotchas”——这是在Windows7之前写的(它以不同的方式处理清单)。我坚持将.NET程序集公开给VBA


我制作了一个简单的COM可见.NET程序集,并试图从Excel VBA调用它。如果我在.NET构建期间“注册COM互操作”,我可以从VBA成功调用它

Sub VBA()    
    Dim obj As Object
    Set obj = actCtx.CreateObject("ComTest.Main")
    MsgBox obj.Test() '<-- Displays "Hello"
End Sub

我正在运行64位Windows 7。

要使用免注册COM,服务器(程序集)和客户端都必须位于同一文件夹中。见:


即使我将所有内容复制到我的Office12文件夹(EXCEL.exe所在的文件夹)并从那里运行它,我也会收到错误。哦,我错过了您试图从VBA使用它的消息。我不认为在这种情况下可以让reg free COM工作,因为这需要为Excel创建一个应用程序清单。另外,将内容复制到应用程序的安装文件夹似乎不是一个好主意。我想当你同时是服务器和客户端的开发人员时,reg free COM的设计是为了便于部署,但是当客户端不了解服务器时,它就不能很好地工作,因为客户端需要在其应用程序清单中引用服务器。请使用clrClass而不是comClass。请尝试在Microsoft Access中执行完全相同的操作。我没有找到在生产环境中部署它的可靠解决方案,因为在尝试通过C#执行regasm时,我无法让它在其他机器上注册。我认为RegFree将是解决这个问题的一个很好的解决方案。“你有没有碰巧让它工作过?”AnthonyGriggs说,“我认为这是不可能的,但我也遇到过同样的问题。”。但是,您可以使用我描述的技术动态注册DLL。
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
<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