我遇到了从C#应用程序到inproc COM服务器组件的COM互操作问题。
我已将问题简化为简单的c#测试程序。它实例化服务器组件的interop类,将字符串的值设置为实例上的属性,然后设置另一个字符串属性。我没有做任何与编组有关的事。只使用我添加对COM组件的引用时生成的interop类。类似的东西:
using MyLib; // Interop assy
// ...
MyComp comp = new MyComp();
comp.Prop1 = "abc";
comp.Prop2 = "xyz";
成果:
如果我在VS之外运行测试程序,那么当设置第二个属性时,我会一直得到一个COMException,其HRESULT为0x80010105
(RPC_E_SERVERFAULT
)。
如果我在Visual Studio 2005中运行测试程序,那么它一直正常工作。
我在非托管C ++中编写了等效代码(没有atl,只是简单的接口指针),这在VS内外都能正常工作。
我的问题:在调试器内运行时可能会考虑到我所看到的内容时发生互操作的环境有何不同?我假设E_RPC_SERVERFAULT
是由interop marshaller生成的,但为什么只在调试器中?有关如何进行此操作的任何建议吗?
[我没有对com组件说太多,因为我的问题是我在调试器中看到的不同行为。该组件经过了充分测试,已投入生产使用超过7年(在服务器环境中每天进行数千次调用),因此我非常有信心。它是一个32位的DLL。我有源,但目前没有适合它的构建环境。即使我这样做,我也不确定如何从托管代码调试它。这可能吗?]
更新
还没有解决方案,但还有一些观察结果:
最后一项指出了我的机器的问题,但我不确定是什么。
[环境是使用Visual Studio 2005 Pro在Win7 Pro 32位上运行的Framework 2.0。]
答案 0 :(得分:1)
您是否可能正在运行AnyCPU构建,并且由于某种原因Visual Studio将程序集加载为32位,但是当您在VS外部运行程序时,它运行为x64,因此无法加载32位COM dll?
答案 1 :(得分:0)
我遇到了同样的问题。在我的情况下,强制.NET应用程序是32位并且
[STAThread]
public static int Main(string [] args)
或(对于线程)
thread = new Thread(DoWorkUsingCOM);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
解决了这个问题。