这个问题是this article的延伸.
在同样的情况下,我通过它的ProgID
创建了一个WMP ActiveX的实例。
protected const string WMP_PROG_ID = "WMPlayer.OCX.7";
private dynamic _wmp;
protected virtual bool init(){
try{
_wmp = Activator.CreateInstance(Type.GetTypeFromProgID(WMP_PROG_ID));
}
catch{ return false; }
return connectEvent();
}
根据MSDN文档中,WMPlayer 对象中有一个 Error
事件和一个 error
属性。
因此,我尝试以这种方式附加事件。
protected bool connectEvent(){
try{
_wmp.PlayStateChange += new StateHandler(_wmp_PlayStateChange);
//_wmp.Error += new Action(_wmp_ErrorEvent);
}
catch { return false; }
return true;
}
protected void _wmp_PlayStateChange(WMPlayerState state){
//do something I like
}
protected void _wmp_ErrorEvent(){
//do some error handling
}
如果我保留 //_wmp.Error += new Action(_wmp_ErrorEvent)
注释,
没有编译错误,PlayStateChange
运行良好。
但是,如果我删除注释标记,则会出现运行时异常。
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法在“System.__ComObject”和“System.Action”之间应用运算符“+=”
这两个“错误”似乎是冲突的,因为 COM 不区分大小写。我该如何解决? 我的目标是在不使用 AxWindowsMediaPlayer 的情况下附加到“错误”事件。
最佳答案
我遇到了与您非常相似的问题,但我遇到的是 Size
。强类型的 ActiveX 控件重新定义了 Size
,因此当表单设计者想要调整表单上控件的大小时,我需要将其转换回 Control
。
((Control)this.axLEAD1).Size = new System.Drawing.Size(298, 240);
如果您可以获得 com 对象的强类型类(通过添加引用或使用 tlbimp.exe ),您可以转换为强类型的 com 对象而不是 __ComObject
并拥有它使用正确的方法。
关于c# - 当我使用区分大小写的语言时如何解决 COM 中不区分大小写的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15759269/