2011-03-02 65 views
1

我有一个C#应用程序到一个inproc COM服务器组件的COM互操作问题。C#/ COM互操作只能在调试器中

我已经将问题简化为一个简单的c#测试程序。它实例化服务器组件的interop类,将实例上的字符串值设置为属性,然后设置另一个字符串属性。我在编组时并没有做任何不寻常的事情。只需使用在添加对COM组件的引用时生成的interop类。喜欢的东西:

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

成果:

  • 如果我跑VS外面的测试程序,然后,当第二属性设置,我一直得到一个与收到COMException的0x80010105的HRESULT(RPC_E_SERVERFAULT) 。

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

我写的托管C等效代码++(ATL没有,只是普通的接口指针),这正常工作在国内外享有很高的VS.

我的问题:在调试器内部运行时发生互操作的环境有什么不同?我认为E_RPC_SERVERFAULT是由interop编组生成的,但为什么只在调试器中?有关如何进行此操作的任何建议?

[我没有多说关于com组件,因为我的问题是关于我看到进出调试器的不同行为。 com组件已经过很好的测试,并且已经在生产中使用了7年(在服务器环境中每天有数千次调用),所以我对此充满信心。它是一个32位的DLL。我有源码,但目前没有适合它的构建环境。即使我这样做,我也不知道如何从托管代码调试它。这是可能的]

UPDATE

没有解决办法,但一些观察:

  1. 我试图运行的应用程序作为管理员,同时还与UAC关闭。同样的结果。
  2. 我试图在发生错误之前附加到进程,但是我看不到在输出窗口中显示正在引发的结构化异常。
  3. 我试着明确地设置测试应用程序的主线程的公寓模型到STA然后MTA,但这没有什么区别。 COM组件是带螺纹的。
  4. 我试图在Win2003机器和不同的Win7专业机器上运行托管测试应用程序(在Visual Studio外)。它在两者上都正确运行。

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

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

+0

你是否偶然以管理员身份运行Visual Studio? UAC /权限可能是一个问题 – BrokenGlass 2011-03-02 20:27:07

+0

这是一个与*进程外* COM服务器紧密关联的错误。这给解释留下了很小的空间。没有调试器没有桨。尝试在启动后附加调试器。 – 2011-03-02 20:28:54

+0

@BrokenGlass好主意。我以管理员身份运行VS2005。不好,我知道,但我在Win7上。我现在在家,vpn到我的开发箱似乎已经关闭,所以我会在早上尝试在管理员命令窗口中运行测试。谢谢! – 2011-03-02 21:55:33

回答

1

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

+0

感谢您的建议。我在64位机器上运行32位窗口。我将目标从AnyCPU更改为x86,但没有任何区别。 – 2011-03-03 11:58:37

0

我有同样类型的问题。在我的情况下迫使.NET应用程序为32位,使

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

或(线程)

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

解决了这个问题。