我试图创建一个在Perl脚本中使用的C#COM对象(据我所知,COM是最好的方法)。
这是C#代码:
using System.Runtime.InteropServices;
namespace ExampleCom
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface IComClass
{
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComClassEvents
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IComClassEvents))]
[ProgId("ExampleCom.ComClass")]
public class ComClass : IComClass
{
}
}
以下是RegAsm的输出:
Microsoft .NET Framework Assembly Registration Utility version 4.0.30319.0
for Microsoft .NET Framework version 4.0.30319.0
Copyright (C) Microsoft Corporation. All rights reserved.
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can ca
use your assembly to interfere with other applications that may be installed on
the same computer. The /codebase switch is intended to be used only with signed
assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
最后,perl脚本:
use Win32::OLE;
$ex = Win32::OLE->new('ExampleCom.ComClass') or die "oops\n";
print $ex;
不幸的是,每次运行Perl脚本时,我都会得到输出"糟糕",所以它不可调用。但是,我可以成功实例化" Excel.Application"宾语。我已经设置了设置"注册COM互操作"和"使组件COM-Visible"在Visual Studio项目设置中,如上所述,我已经单独使用RegAsm来尝试注册dll。
有没有人可以在这里分享经验,指出正确的方向或者告诉我哪里出错了?
感谢。
答案 0 :(得分:1)
有一个比oops更有用的调试消息会有所帮助。我建议编写一个可以提供更有用信息的vbscript程序。
您的Perl版本是32位还是64位?如果它是64位,那么您的程序失败,因为进程内服务器(DLL OLE服务器)必须与其客户端具有相同的位。如果是这种情况,那么您需要运行64位版本的regasm,它将位于Framework64目录而不是Framework目录中。
Excel将成功,因为它是一个进程外服务器,并且不需要匹配位 - 当然位数可能匹配。
一个简单的vbscript程序是:
Dim obj
Set obj = CreateObject("ExampleCom.ComClass")
MsgBox TypeName(obj)
在64位操作系统上,标准版本的cscript.exe或wscript.exe是一个64位程序。您可以尝试使用c:\ windows \ SysWOW64 \ wscript.exe(或cscript.exe)运行32位版本。