Interop:在ASMX webservice或WCF服务中使用COM - C#

时间:2011-03-10 08:22:59

标签: wcf web-services iis com com-interop

最近,我遇到了一个我认为很容易实现的问题。 我的Windows 7计算机上已经安装了COM对象。 我正在尝试围绕此COM对象构建Web服务或WCF服务。 不幸的是,无论我尝试什么似乎都没用。

我安装了Visual Studio 2008和2010。 使用VS IDE,我创建了对COM的引用,并且正如预期的那样,VS自动创建了访问COM成员所需的互操作DLL。

当我在winforms应用程序中尝试这个时,一切正常,但是当在服务中使用时,我的运气就消失了。

代码是超级简单的,看起来像这样:

LCDirect_WebLogin.CoClass_n_ap_com com = (LCDirect_WebLogin.CoClass_n_ap_com)obj.Unwrap();
object value = null;
string name = "";
com.getsysteminfo(name, ref value);
if (value != null)
    return value.ToString();

因此,winform应用程序中的相同代码工作正常但在IIS下崩溃。

一些额外的信息: 最后,我需要部署在Windows 2003 Server上。 COM DLL依赖于PowerBuilder运行时。我在我的system32中复制了PB运行时,也在web服务器的bin文件夹中复制了它。

我不认为这是一个依赖性问题,而是调用非托管代码的安全问题。

我还尝试使用应用程序池在一个更加经过验证的帐户下运行Web服务,并使用管理员帐户运行。同样的问题。

有什么想法吗? 感谢。

3 个答案:

答案 0 :(得分:4)

最后我解决了我的问题。 解决方案是在STA模式下运行COM对象。 我在这里找到了解决方案:http://www.techrepublic.com/article/application-development-calling-a-com-object-from-a-web-service-in-net/5152421

答案 1 :(得分:0)

在您的Windows应用中,您处于登录用户的安全上下文中。

在服务中,默认是您在应用程序池标识的安全上下文中执行。可能是NETWORK SERVICE用户,不允许调用COM。

答案 2 :(得分:0)

对于谁可能对另一个优雅的解决方案感兴趣: http://msdn.microsoft.com/en-us/magazine/cc163544.aspx