在花的最后几天阅读所有我能找到的关于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不会让我剪切和粘贴,对不起...)
乔恩,我想你已经正确地确定这个问题是有setter方法。该DLL是写在富士通COBOL和提供了一个“在幕后”获取和设置标识为属性字段。访问从C#或COBOL COM组件,它工作正常,但是,你可以看到,当我尝试它不工作,并与反射访问它的设置。因为我不熟悉使用反射我怀疑我是否有语法正确的,所以我试图使SET尽可能接近的GET。我想我会需要生成我自己的一套方法(对于每个属性)进入COBOL,然后更改我的“BindingFlags.SetProperty”是“BindingFlags.InvokeMember”。 (我做的BindingFlags的功课,发现如果你指定“的SetProperty”,它会自动意味着你提到的其他2个标志。)
我认为,关键这一切是在认识到问题是与富士通* COM类设置,并花了你的眼睛经验丰富地看到。非常感谢。如果你看到OLEVIEW之后还有其他的意见,也可以提出任何替代方法,以获取属性设置,我会很感兴趣。 (我不期待着有以生成每个属性的setter方法;也有点蛮力... :-))
再次感谢,
皮特。
汉斯是正确的。问题是与setter方法。我已经写代码,以产生用于每个属性的设定器,早在原始COBOL COM组件。这不是繁琐的或丑陋的,因为我认为这将是(每个属性约7行COBOL的),它是所有现在工作得很好。非常感谢社会各界,特别是汉斯帕桑特支持。