C#/ COM互操作仅在调试器中工作

从C#应用程序到inproc COM服务器组件的COM互操作有问题。

我已将问题简化为简单的c#测试程序。 它实例化服务器组件的interop类,将字符串的值设置为实例上的属性,然后设置另一个字符串属性。 我没有做任何与编组有关的事。 只使用我添加对COM组件的引用时生成的interop类。 就像是:

using MyLib; // Interop assy // ... MyComp comp = new MyComp(); comp.Prop1 = "abc"; comp.Prop2 = "xyz"; 

成果:

  • 如果我在VS之外运行测试程序,那么当设置第二个属性时,我一直得到一个0x80010105 ,其HRESULT为0x80010105RPC_E_SERVERFAULT )。

  • 如果我在Visual Studio 2005中运行测试程序,那么它一直正常工作。

我在非托管C ++中编写了等效代码(没有atl,只是简单的接口指针),这在VS内外都能正常工作。

我的问题 :在调试器内部运行时可能会考虑到我所看到的内容时发生互操作的环境有何不同? 我假设interop marshaller正在生成E_RPC_SERVERFAULT ,但为什么只在调试器中? 有关如何进行此操作的任何建议?

[我没有对com组件说太多,因为我的问题是我在调试器中看到的不同行为。 该组件经过了充分测试,已经投入生产使用超过7年(在服务器环境中每天进行数千次调用),因此我对此非常有信心。 它是一个32位的DLL。 我有源,但目前没有适合它的构建环境。 即使我这样做,我也不确定如何从托管代码调试它。 这可能吗?]

UPDATE

还没有解决方案,但还有一些观察:

  1. 我尝试以管理员身份运行应用程序,并且还关闭了UAC。 结果相同。
  2. 我尝试在错误发生之前附加到进程但是在输出窗口中没有看到抛出结构化exception的指示。
  3. 我尝试将测试应用程序主线程的公寓模型显式设置为STA,然后设置为MTA,但这没有任何区别。 COM组件是公寓线程。
  4. 我尝试在Win2003机器和不同的Win7 pro机器上运行托管测试应用程序(在visual studio之外)。 它在两者上都能正常工作。

最后一项指出了我的机器的问题,但我不确定是什么。

[环境是使用Visual Studio 2005 Pro在Win7 Pro 32位上运行的Framework 2.0。]

您是否可能正在运行AnyCPU构建,并且由于某种原因Visual Studio将程序集加载为32位,但是当您在VS外部运行程序时,它运行为x64,因此无法加载32位COM dll?

我有同样类型的问题。 在我的情况下,强制.NET应用程序是32位和制作

  [STAThread] public static int Main(string [] args) 

或(对于线程)

  thread = new Thread(DoWorkUsingCOM); thread.SetApartmentState(ApartmentState.STA); thread.Start(); 

解决了这个问题。