Sim*_*wen 10 .net com vba side-by-side regfreecom
我正在尝试使用Excel作为客户端,以及作为服务器的.NET dll,使用免注册COM.目前我只是试图让概念验证工作,但我遇到了麻烦.
显然,当我使用Excel时,我不能简单地使用与可执行文件一起生成的客户端清单,所以我正在使用Microsoft.Windows.ActCtx
(链接)
我将客户端清单,程序集清单和dll都放在同一位置.
不幸的是,在C#中工作的东西似乎不适用于Excel/VBA,我很难理解.虽然C#测试客户端工作正常,但VBA发出80070002错误,对象'IActCtx'的消息方法'CreateObject'失败.
我有一个.NET DLL(COMTestService.dll)暴露COM(COMTestObject
/ ICOMTestObject
)的单个类/接口,如下所示:
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
客户端清单(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>
Run Code Online (Sandbox Code Playgroud)
程序集清单(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>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
编辑
情节复杂起来......只是为了好玩,我写了一个快速COM可见,注册辅助类做的在C#中创建对象,然后将它传递回来,用线沿线的方法public object CreateObject(string manifestPath, string typeName)
现在,从C#的exe作品调用此很好,但从VBA调用它失败(再次80070002,消息:系统找不到指定的文件.).现在我更加困惑......
在此先感谢您的帮助,如果我需要提供更多信息,请告诉我,我很乐意帮忙!
我不能说我曾经尝试过使用这种技术,而且这些年来我已经完成了很多安装。我想知道,为什么不直接注册你的 .NET COM Visible 服务器呢?Regasm 倾向于在注册表中创建非常干净且轻量级的 COM 注册。比旧的非托管 DllRegisterServer() 东西干净得多。
归档时间: |
|
查看次数: |
2153 次 |
最近记录: |