我需要创建一个基于 C# 的 COM 服务器以便在 VBScript 中使用
I need to create a C# based COM Server for consumption in VBScript
我正在用 C# 创建一个 COM 服务器 .dll(.NET 3.0 - 外部要求)。有些客户可以很好地使用它,但其他客户则不能。具体来说,我在让 VBScript 喜欢它时遇到了问题。
主要有两个组成部分:
一个。一个接口
b.一个实现对象
它们都有自己的 GUID。实现 class 明确实现接口。
选中 'Assembly Information' 对话框复选框 'Make assembly COM-Visible'。
'Build' 对话框复选框 'Register for COM interop' 也被选中。
我还签署了程序集,创建了一个强名称密钥。
无奈之下,我添加了System.EnterpriseServices.ServicedComponent
程序集:
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
public class TwoPays : ServicedComponent, ITwoPays
{
void ITwoPays.TestConnect()
{
...
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
public interface ITwoPays
{
我也运行regsvcs.exe
.
RegSvcs.exe LandCORC.dll
Microsoft (R) .NET Framework Services Installation Utility Version 2.0.50727.5483
Copyright (c) Microsoft Corporation. All rights reserved.
失败:
WARNING: The assembly does not declare an ApplicationAccessControl Attribute. Application security will be enabled by default.
Installed Assembly:
Assembly: C:\Source\LandCORC\bin\Release\LandCORC.dll
Application: LandcORC
TypeLib: C:\Source\LandCORC\bin\Release\LandCORC.tlb
由于我对应用程序安全也一无所知,所以我不确定来自 RegSvcs.exe
的警告消息是否重要。
所以我一直在使用VbsEdit 来测试它。在我添加 ServicedComponent
和 运行 RegSvcs.exe
之前,它会死于 Set objXL = CreateObject("LandCORC.TwoPays")
语句。
现在完成了,但是当我尝试调用 TestConnect
时,它说 objXL
是一个无效指针,例如:
Dim objXL
Set objXL = CreateObject("LandCORC.TwoPays")
objXL.TestConnect
添加对 VbsEdit 的引用:
Prog ID: LandCORC.TowPays
TypeLib path: C:\Source\LandCORC\bin\Release\LandCORC.tlb
GUID: {0135BC5C-B248-444C-94B9-B0B4577F5A1B}
但是如果我将 VbsEdit 引用更改为使用接口 GUID,那么 objXL
的自动完成将显示正确的方法列表,但是当它执行时我得到 '对象不支持此 属性 或方法:TestConnect' 相反。
我不知道完成这个拼图需要什么。
新信息
根据 Kev 的回答,我更正了接口和 class 定义。
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
[InterfaceType( ComInterfaceType.InterfaceIsDual )]
[ComVisible( true )]
public interface ITwoPays
{
[DispId( 1 )]
void TestConnect();
[DispId( 2 )]
void Terminate();
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
[ClassInterface( ClassInterfaceType.None )]
[ComVisible( true )]
public class TwoPays : ITwoPays
{
[ComVisible( true )]
public void TestConnect()
{
LogInformationMessage( "TestConnect." );
}
[ComVisible( true )]
public void Terminate()
{
和 运行 RegAsm /codebase /register /tlb 和 运行 gacutil -i 表示 程序集已成功添加到缓存
这是一个我有类似需求的项目,一个 InProc COM 包装的 .NET 组件对 VBScript 和 Classic 可见 ASP(在 COM 术语中 IDispatch
友好)。
我已经重命名了接口、class 和方法,但你应该明白了。
声明我们的接口:
[Guid("0B201484-E388-45eb-9AB8-A6AE1E197AAB")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IThingy
{
[DispId(1)]
int DoThing1(string name, int age);
[DispId(2)]
string DoThing2(int id);
[DispId(3)]
bool DoThing3(string address);
}
实施:
[Guid("68FAB6AC-9923-425a-85F2-59B50552A5C1")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Thingy: IThingy
{
[ComVisible(true)]
public int DoThing1(string name, int age)
{
// ....
}
[ComVisible(true)]
public string DoThing2(int id)
{
// ....
}
[ComVisible(true)]
public bool DoThing3(string address)
{
// ....
}
}
我还必须生成一个程序集密钥文件,这是因为 COM 包装的 .NET 程序集需要 "strongly named"(我依稀记得 - 我写这段代码已经十年了)。
接下来,我重新加载了在注册表中执行所有有趣的 COM 连接的程序集:
regasm.exe COMExample.Fun.dll /register /codebase /tlb
然后在 GAC 中删除它:
gacutil.exe -i COMExample.Fun.dll
要卸载:
gacutil.exe -u COMExample.Fun.dll,Version=1.0.0.0
regasm.exe COMExample.Fun.dll /unregister /tlb
摆脱 System.EnterpriseServices
和 ServicedComponent
的东西。只有在 运行 在 COM+ 中建立进程外服务器并需要 COM+ 事务基础结构等时才需要
我正在用 C# 创建一个 COM 服务器 .dll(.NET 3.0 - 外部要求)。有些客户可以很好地使用它,但其他客户则不能。具体来说,我在让 VBScript 喜欢它时遇到了问题。
主要有两个组成部分:
一个。一个接口
b.一个实现对象它们都有自己的 GUID。实现 class 明确实现接口。
选中 'Assembly Information' 对话框复选框 'Make assembly COM-Visible'。
'Build' 对话框复选框 'Register for COM interop' 也被选中。
我还签署了程序集,创建了一个强名称密钥。
无奈之下,我添加了System.EnterpriseServices.ServicedComponent
程序集:
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
public class TwoPays : ServicedComponent, ITwoPays
{
void ITwoPays.TestConnect()
{
...
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
public interface ITwoPays
{
我也运行regsvcs.exe
.
RegSvcs.exe LandCORC.dll Microsoft (R) .NET Framework Services Installation Utility Version 2.0.50727.5483 Copyright (c) Microsoft Corporation. All rights reserved.
失败:
WARNING: The assembly does not declare an ApplicationAccessControl Attribute. Application security will be enabled by default.
Installed Assembly:
Assembly: C:\Source\LandCORC\bin\Release\LandCORC.dll
Application: LandcORC
TypeLib: C:\Source\LandCORC\bin\Release\LandCORC.tlb
由于我对应用程序安全也一无所知,所以我不确定来自 RegSvcs.exe
的警告消息是否重要。
所以我一直在使用VbsEdit 来测试它。在我添加 ServicedComponent
和 运行 RegSvcs.exe
之前,它会死于 Set objXL = CreateObject("LandCORC.TwoPays")
语句。
现在完成了,但是当我尝试调用 TestConnect
时,它说 objXL
是一个无效指针,例如:
Dim objXL
Set objXL = CreateObject("LandCORC.TwoPays")
objXL.TestConnect
添加对 VbsEdit 的引用:
Prog ID: LandCORC.TowPays
TypeLib path: C:\Source\LandCORC\bin\Release\LandCORC.tlb
GUID: {0135BC5C-B248-444C-94B9-B0B4577F5A1B}
但是如果我将 VbsEdit 引用更改为使用接口 GUID,那么 objXL
的自动完成将显示正确的方法列表,但是当它执行时我得到 '对象不支持此 属性 或方法:TestConnect' 相反。
我不知道完成这个拼图需要什么。
新信息 根据 Kev 的回答,我更正了接口和 class 定义。
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
[InterfaceType( ComInterfaceType.InterfaceIsDual )]
[ComVisible( true )]
public interface ITwoPays
{
[DispId( 1 )]
void TestConnect();
[DispId( 2 )]
void Terminate();
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
[ClassInterface( ClassInterfaceType.None )]
[ComVisible( true )]
public class TwoPays : ITwoPays
{
[ComVisible( true )]
public void TestConnect()
{
LogInformationMessage( "TestConnect." );
}
[ComVisible( true )]
public void Terminate()
{
和 运行 RegAsm /codebase /register /tlb 和 运行 gacutil -i 表示 程序集已成功添加到缓存
这是一个我有类似需求的项目,一个 InProc COM 包装的 .NET 组件对 VBScript 和 Classic 可见 ASP(在 COM 术语中 IDispatch
友好)。
我已经重命名了接口、class 和方法,但你应该明白了。
声明我们的接口:
[Guid("0B201484-E388-45eb-9AB8-A6AE1E197AAB")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IThingy
{
[DispId(1)]
int DoThing1(string name, int age);
[DispId(2)]
string DoThing2(int id);
[DispId(3)]
bool DoThing3(string address);
}
实施:
[Guid("68FAB6AC-9923-425a-85F2-59B50552A5C1")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Thingy: IThingy
{
[ComVisible(true)]
public int DoThing1(string name, int age)
{
// ....
}
[ComVisible(true)]
public string DoThing2(int id)
{
// ....
}
[ComVisible(true)]
public bool DoThing3(string address)
{
// ....
}
}
我还必须生成一个程序集密钥文件,这是因为 COM 包装的 .NET 程序集需要 "strongly named"(我依稀记得 - 我写这段代码已经十年了)。
接下来,我重新加载了在注册表中执行所有有趣的 COM 连接的程序集:
regasm.exe COMExample.Fun.dll /register /codebase /tlb
然后在 GAC 中删除它:
gacutil.exe -i COMExample.Fun.dll
要卸载:
gacutil.exe -u COMExample.Fun.dll,Version=1.0.0.0
regasm.exe COMExample.Fun.dll /unregister /tlb
摆脱 System.EnterpriseServices
和 ServicedComponent
的东西。只有在 运行 在 COM+ 中建立进程外服务器并需要 COM+ 事务基础结构等时才需要