gpt4 book ai didi

.net - RegFree COM 从 C# 工作,而不是从 VBA 工作

转载 作者:行者123 更新时间:2023-12-03 17:59:21 29 4
gpt4 key购买 nike

我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。

显然,当我使用 Excel 时,我不能简单地使用与可执行文件一起存在的客户端 list ,所以我使用 Microsoft.Windows.ActCtx (link)

我将客户端 list 、程序集 list 和 dll 都放在同一个位置。

不幸的是,在 C# 中起作用的东西似乎在 Excel/VBA 中不起作用,我对原因感到困惑。虽然 C# 测试客户端运行良好,但 VBA 给出了 80070002 错误,消息 Method 'CreateObject' of object 'IActCtx' failed。

我有一个 .NET dll (COMTestService.dll) 向 COM ( COMTestObject/ICOMTestObject ) 公开单个类/接口(interface),如下所示:

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("EEE50CDF-D8EC-4F38-B986-C231EC45171E")]
public interface ICOMTestObject
{
[ComVisible(true)]
string GetString(int number);
}

[ComVisible(true), ClassInterfaceAttribute(ClassInterfaceType.None), ComDefaultInterface(typeof(ICOMTestObject))]
[Guid("6E54611B-8B56-49E0-9415-E59B0774A4BE")]
public class COMTestObject : ICOMTestObject
{
public COMTestObject()
{
}

public string GetString(int number)
{
return string.Format("The number is: {0}", number);
}
}

客户端 list (COMTestService_Client.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
manifestVersion="1.0"
xmlns="urn:schemas-microsoft-com:asm.v1" >
<assemblyIdentity
name="client"
version="1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity
name="COMTestService"
version="1.0.0.0"
processorArchitecture="msil" />
</dependentAssembly>
</dependency>
</assembly>

程序集 list (COMTestService.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
manifestVersion="1.0"
xmlns="urn:schemas-microsoft-com:asm.v1" >
<assemblyIdentity
name="COMTestService"
version="1.0.0.0"
processorArchitecture="msil" />
<clrClass
clsid="{6E54611B-8B56-49E0-9415-E59B0774A4BE}"
progid="COMTestService.COMTestObject"
threadingModel="Both"
name="COMTestService.COMTestObject"
runtimeVersion="v4.0.30319">
</clrClass>
<file
name="COMTestService.dll"
hashalg="SHA1">
</file>
</assembly>

VBA 客户端代码:

Dim actCtx As Object
Set actCtx = CreateObject("Microsoft.Windows.ActCtx")
actCtx.Manifest = "...\COMTestService_Client.manifest"

Dim testObject As Object
Set testObject = actCtx.CreateObject("COMTestService.COMTestObject") 'This line throws...

Dim text As String
text = thing.GetString(42)

Debug.Print text

C# 客户端代码:

var actCtxType = System.Type.GetTypeFromProgID("Microsoft.Windows.ActCtx");
dynamic actCtx = System.Activator.CreateInstance(actCtxType);
actCtx.Manifest = @"...\COMTestService_Client.manifest";

var type = System.Type.GetTypeFromProgID("COMTestService.COMTestObject");
dynamic obj = System.Activator.CreateInstance(type);
dynamic s = obj.GetString(42);

编辑

情节变厚了...只是为了好玩,我写了一个快速的 COM 可见的 REGISTERED 辅助类来在 C# 中创建对象,然后使用类似于 public object CreateObject(string manifestPath, string typeName) 的方法将其传回。现在,从 C# exe 调用它可以正常工作,但从 VBA 调用它失败(再次为 80070002,消息:系统找不到指定的文件。)。现在我更迷茫了……

在此先感谢您的帮助,如果我需要提供更多信息,请告诉我,我很乐意提供帮助!

最佳答案

使用进程监视器,我发现正在 C:/Program Files/Microsoft Office/Office11/中搜索 dll。我将所有的 dll 移到那里,错误就消失了。

在旁注中,如果有人知道如何告诉 Excel 不要在那里查找我的文件,而是在哪里找到 .tlb,我很感兴趣。 (我已经尝试将路径添加到 PATH 环境变量)

关于.net - RegFree COM 从 C# 工作,而不是从 VBA 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805228/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com