使用PerlNET将COM对象从C#传递到Perl

使用PerlNET将COM对象从C#传递到Perl,c#,perl,com,activestate,ole-automation,C#,Perl,Com,Activestate,Ole Automation,我正在尝试将COM对象从C#代码传递到Perl。 目前,我正在用PerlNET(PDK 9.4;ActiveState)包装我的Perl代码,并且我已经在Perl中定义了一个简单的子例程(+必需的pod声明),以将对象从C#传递到包装好的Perl模块 我传递的对象似乎没有正确识别为COM对象 例如: 在C#(.NET4.0)中,ScriptControl用于从用VBScript编写的文件加载简单类 var host=newscriptcontrol(); host.Language=“VBScr

我正在尝试将COM对象从C#代码传递到Perl。
目前,我正在用PerlNET(PDK 9.4;ActiveState)包装我的Perl代码,并且我已经在Perl中定义了一个简单的子例程(+必需的pod声明),以将对象从C#传递到包装好的Perl模块

我传递的对象似乎没有正确识别为COM对象

例如:
在C#(.NET4.0)中,ScriptControl用于从用VBScript编写的文件加载简单类

var host=newscriptcontrol();
host.Language=“VBScript”;
var text=File.ReadAllText(“TestScript.vbs”);
host.AddCode(文本);
动态obj=host.Run(“GetTestClass”);
我得到的(
obj
)属于
系统类型。当我将其传递给Perl/PerlNET程序集并尝试在Perl中调用方法
Xyz()
时,我得到以下(运行时)异常:

Can't locate public method Xyz() for System.__ComObject
但是,如果我在Perl中做了或多或少相同的事情,它就会工作。(在以下情况下,仅将my.vbs文件的内容作为参数传递。) 我甚至可以使用脚本控件:

sub-UseScriptControl{
我的($self,$text)=@;
我的$script=Win32::OLE->new('ScriptControl');
$script->{Language}='VBScript';
$script->AddCode($text);
my$obj=$script->Run('GetTestClass');
$obj->Xyz();
}
现在,在
obj
上调用
Xyz()
可以正常工作(使用Win32::OLE)

在这两种情况下,我都使用:

使用严格;
使用Win32;
使用Win32::OLE::Variant;
另一种方法:
如果我确切地指定了要使用的重载和要传递的类型,我可以使用类
System.Type
InvokeMember
调用方法:

使用PerlNET qw(typeof);
typeof($obj)->InvokeMember(“Xyz”,
PerlNET::enum(“System.Reflection.BindingFlags.InvokeMethod”),
PerlNET::null(“System.Reflection.Binder”),
$obj,
“System.Object[]”->new());
使用这种方法意味着重写整个包装好的Perl模块。使用这种语法

现在我想知道,如果将PerlNET与COM对象一起使用,是否会失去.NET 4.0中dynamic关键字的优点和Perl(使用Win32::OLE)的动态特性

似乎我首选的解决方案可以归结为某种模仿C#/.NET4.0中
动态
关键字行为的方法

或者,更好的方法是找到某种方法,将传递的COM对象转换为与
Win32::OLE
兼容的对象。可以提取
\uuu ComObject
的一些信息,以便将其正确标识为COM对象

我必须补充一点,我也在PDK讨论网站上发布了帖子(但还没有得到任何回复):
我还将其发布到了PerlMonks——因为我不太确定这更像是一个Perl或C#/.NET问题:

我将非常感谢任何帮助-或建议在哪里进一步寻找