C#反射矛盾与COM对象

问题描述 投票:0回答:1

在花的最后几天阅读所有我能找到的关于C#反思COM对象,试图在代码中的许多实验和分析示例代码尝试和改进我的理解,我现在不得不承认,我只是不知道够不够,所以我请求来自社区的帮助。

我需要能够被包装成System._COM对象后期绑定的COM对象的访问和更新的属性。

我尝试了所有的标准恢复体力的东西都没有成功,我通过使用IDispatch看,但我不舒服的使用所涉及的指针,所以我希望我已经错过了一些在正常的界面很简单。我发现在MSDN上的论文那些展示如何做我所需要的,但所有的例子都是在C ++中,这是在我的头上。

这将是非常有益的,如果有人可以解释为什么预期下面简单的C#代码是行不通的:

            try
        {
            // late binding:
            // localCB is a COM object (System._COMObject) created by Activator.CreateInstance() from 
            // the ProgID of a registered COM .DLL. 
            // 
            // The original .DLL has a string PROPERTY called 
            // "TESTEXTERNAL1". localCB has an IDispatch Interface.  The original COM .DLL has a separate Typelib,
            // and, although I did not register the typelib separately, I can see from OLEView on the COM object
            // that  the GUID for the typelib is included in it.

            // Here's the code that is puzzling me...
             var vv = localCB.GetType().InvokeMember("TESTEXTERNAL1", BindingFlags.GetProperty, 
                  null, localCB, null);
            string rt = vv.ToString();
            // works exactly as expected and returns the value of TESTEXTERNAL1 -  OK.

            // now try and update the SAME PROPERTY, on the SAME COM object...
            Parameters = new Object[1];
            Parameters[0] = "Hello, World!";
            localCB.GetType().InvokeMember("TESTEXTERNAL1", BindingFlags.SetProperty, 
                  null, localCB, Parameters);
            // throws an (inner) exception: HRESULT 0x8002003 DISP_E_MEMBERNOTFOUND !!!

        }
        catch (Exception xa)
        {
            string xam = xa.Message;
        }

它是不合理的期望,已经发现和提供的属性,才能够更新相同属性的对象?有一些“另类更新”的策略,我不知道呢?

非常感谢您的帮助,

皮特。

更新:

响应乔恩的要求,这里有OLEVIEW的片段:(我不得不使用图像,因为OLEVIEW不会让我剪切和粘贴,对不起...)

OleView of the COM .DLL

OLEView typelib view

乔恩,我想你已经正确地确定这个问题是有setter方法。该DLL是写在富士通COBOL和提供了一个“在幕后”获取和设置标识为属性字段。访问从C#或COBOL COM组件,它工作正常,但是,你可以看到,当我尝试它不工作,并与反射访问它的设置。因为我不熟悉使用反射我怀疑我是否有语法正确的,所以我试图使SET尽可能接近的GET。我想我会需要生成我自己的一套方法(对于每个属性)进入COBOL,然后更改我的“BindingFlags.SetProperty”是“BindingFlags.InvokeMember”。 (我做的BindingFlags的功课,发现如果你指定“的SetProperty”,它会自动意味着你提到的其他2个标志。)

我认为,关键这一切是在认识到问题是与富士通* COM类设置,并花了你的眼睛经验丰富地看到。非常感谢。如果你看到OLEVIEW之后还有其他的意见,也可以提出任何替代方法,以获取属性设置,我会很感兴趣。 (我不期待着有以生成每个属性的setter方法;也有点蛮力... :-))

再次感谢,

皮特。

c# reflection com oleview
1个回答
0
投票

汉斯是正确的。问题是与setter方法。我已经写代码,以产生用于每个属性的设定器,早在原始COBOL COM组件。这不是繁琐的或丑陋的,因为我认为这将是(每个属性约7行COBOL的),它是所有现在工作得很好。非常感谢社会各界,特别是汉斯帕桑特支持。

© www.soinside.com 2019 - 2024. All rights reserved.