我正在C#中创建COM服务器.dll(.NET 3.0-外部要求)。一些客户可以很好地使用它,而其他客户则不能。具体来说,我在让VBScript喜欢它时遇到了问题。
有两个主要组成部分:
一种。接口
b。一个实现对象
他们都有自己的GUID。实现类明确实现了接口。
选中“装配体信息”对话框复选框“使装配体COM-可见”。
还选中了“生成”对话框复选框“注册COM互操作”。
我还签署了大会,创建了一个强名称密钥。
无奈之下,我添加了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安装实用程序版本2.0.50727.5483版权所有(c)Microsoft Corporation。版权所有。
失败的原因:
警告:程序集未声明ApplicationAccessControl属性。默认情况下将启用应用程序安全性。
已安装的程序集:程序集:
C:\ Source \ LandCORC \ bin \ Release \ LandCORC.dll
应用程序: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的答案,我更正了接口和类的定义。
[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一样,这表明Assembly已成功添加到缓存中
这来自一个我有类似要求的项目,一个InProc COM包装的.NET组件对VBScript和Classic ASP是可见的(IDispatch
在COM中很友好)。
我已将接口,类和方法重命名,但是您应该明白了。
声明我们的界面:
[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程序集需要“强命名”(我隐约记得-自编写此代码以来已经十年了)。
接下来,我重新组装了在注册表中进行所有有趣的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 +事务基础结构等时才需要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句