c# - 当我使用区分大小写的语言时如何解决 COM 中不区分大小写的名称冲突

标签 c# com case-sensitive case-insensitive wmp

这个问题是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/

相关文章:

c# - 创建 WCF 服务时要避免哪些 DataContract 对象类型?

c++ - 实例化 COM 和 ATL 类型

python - 过滤列,指定区分大小写

c# - 如何将异步操作与 .NET 4 中的任务并行库链接起来?

c# - GTK# : What should the parameter of ListStore be ?

java - 如何从从 C# 接收到的字节数组加载图像?安卓应用

Python win32com 常量

powershell - 无法在PowerShell函数中运行[System .__ ComObject] .InvokeMember

c# - 如何改进这种将名称转换为正确大小写的方法?

sails.js - 如何从 sails-mongo native 结果正确实例化水线模型对象?