【问题标题】:Running C# Interop Control ActiveX on Client Side from ASP.NET从 ASP.NET 在客户端运行 C# 互操作控件 ActiveX
【发布时间】:2011-10-20 04:43:45
【问题描述】:

我正在尝试使用 ASP.NET 和 Interop COM 制作一个简单的 Web 应用程序。

主要问题是:如何让 Interop COM 在客户端工作?

我正在使用:
IIS Windows Server 2008
C# 互操作 COM - Visual Studio 2010
Asp .NET - Visual Studio 2010

看了这些文章后
http://msdn.microsoft.com/en-us/library/aa479302.aspx
http://msdn.microsoft.com/en-us/magazine/cc301832.aspx.
我尝试通过两种方式在客户端使用该组件:

第一:

<object id="Obj" codebase="MyApp.dll#version=1,0,0,0" classid="clsid:C6659361-1625-4746-931C-36014B146679" VIEWASTEXT></object> 
    <script type="text/javascript" >
        function test() {
            alert('TEst');
            Obj.PrintHi();
            alert('and');
        }
    </script>

第二: 在.aspx中

<object id="Obj" codebase="MyApp.dll#version=1,0,0,0" classid="clsid:C6659361-1625-4746-931C-36014B146679" VIEWASTEXT></object>

在 .cs 文件中:

RegisterClientScriptBlock("showSaveMessage", "<script language=\"JavaScript\"> Obj.PrintHi();  </script>");

在服务器端,我打开 Internet Explorer 并像魅力一样工作。但是在客户端出现:Object does not support this property or method.

我也试过了:

<%
    set Obj = CreateObject("MyApp.MyClass")

    Obj.PrintHi
%>

对双方都有效,但只调用安装在服务器端的 MyApp.dll。

使用“对象标签”是正确的方法吗?还有另一种在客户端使用 COM 的方法吗?如何配置IIS以避免Object在客户端不支持该属性或方法?

提前致谢

1#更新

我在使用 C# Interop COM 的 Windows XP 32 位上的 Visual Studio 2010 中创建 ASP.NET C#。 在我的机器“Windows XP”上,我开始调试并且 IE 页面与我的应用程序一起打开。这行得通。
所以我将项目复制到 Windows Server 2008 并在 IIS 中添加了项目。当我运行 IIS 时打开 IE 并且这工作。

在此之后我尝试进行最终测试,所以我在 Windows XP 上打开 IE 并输入 Windows Server 生成的地址,很好,我可以看到页面,但是当我点击运行函数时,出现:“Object does not support this property or method”。

服务器:
Windows 2008 R2 64 位
IE 版本 9

客户:
Windows XP 32 位
IE 8 版

2#更新

我尝试了另一个测试

我制作了一个新的组件 COM
IClassTest.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace MyCOM
{
    [ComVisible(true)]
    [Guid("8F388924-7743-4166-993F-CBF897D08A8B")]
    public interface IClassTest
    {
        string getString(string str);
    }
}

ClassTest.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace MyCOM
{
    [ComVisible(true)]
    [Guid("1AE4AD64-A951-4E6C-8600-AA1F08810DDD")]
    public class ClassTest : IClassTest
    {
        public string getString(string str)
        {
            return str + "1";
        }
    }
}

在 AssemblyInf.cs 中有 [assembly: ComVisible(true)]

我又做了一个asp应用:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="asp_test._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<object id="Obj" codebase="MyCOM.dll#version=1,0,0,0" classid="clsid:1AE4AD64-A951-4E6C-8600-AA1F08810DDD" VIEWASTEXT></object> 
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

<script type="text/javascript" >
    function test() {
        var test = Obj.getString('2');
        alert(test);
    }
    </script>
    <input name="btnTest" value="Call COM" onclick="test()" style=" width: 400px;" type="button">
</asp:Content>

我将 IE 设置更改为显示 ActiveX 不信任并运行该程序。 在 Windows XP 中有效,在 Windows Server 中有效。但是尝试从windows XP调用页面时出现“Windows XP调用Windows 2008页面”:“对象不支持该属性或方法”

如果在客户端我做regasm /u MyCOM.dll IE 提示安装组件。 dll存储在C:\WINDOWS\Downloaded Program Files,如果我尝试安装不止一次,会创建一个名为CONFLICT.1..C:\WINDOWS\Downloaded Program Files\CONFLICT.1的文件夹,很奇怪。我也尝试用regasm MyCOM.dll /codebase注册这个下载的组件。

服务器 .NET:C:\Windows\Microsoft.NET\Framework\v4.0.30319
客户端.NET:C:\Windows\Microsoft.NET\Framework\v4.0.30319

为什么不工作?没有意义。

3#更新

我在另一台机器“客户端”上运行。我将 IE 设置更改为运行不安全的 ActiveX。并且工作,在此之后我尝试在 Windows XP 客户端上我重置设置并再次设置运行 ActiveX 不安全。这有效。

现在问题与从 ASP 安装 Interop COM 有关。我尝试安装但出现:对象不支持此属性或方法。我认为它与Safe Inicialization 有关。我找到了这个链接:http://msdn.microsoft.com/en-us/library/aa751977.aspx#iobjsafe 但是是针对 C++ 的,有 C# 示例吗?

4#更新

我尝试使用:
public class ClassTest : System.Windows.Forms.UserControl, IClassTest
我也试过做一个 .cab 文件,但没有用。

我需要制作 wpf 项目吗?为什么这不起作用?

【问题讨论】:

  • 你的 COM dll 在客户端注册了吗?如果你不这样做,它永远不会起作用
  • @yms 是的,我做到了。我注册了 regasm MyApp.dll /codebase.
  • 您的“客户端”是 64 位操作系统吗?如果是,也许你需要为这两种架构注册你的 dll。详情请见this answer in SO
  • @yms 我的“客户端”是 Windows XP 32 位。我没有文件夹“Framework64”:(
  • @yms 在 IIS 中,我在 V4.0.NET 中标记为启用 32 位应用程序,但在客户端出现相同的消息“对象不支持此属性或方法”。谢谢

标签: c# asp.net iis com interop


【解决方案1】:

我找到了解决方案:Deploy C# ActiveX in a CAB for Internet Explorer use

我做了以下事情:

强命名的程序集。
创建了一个 INF 文件
使用 Visual Studio 2010“安装项目”模板创建了一个 MSI。
使用“Makecab.exe”创建了一个 CAB 文件

有关详细信息,请参阅此链接以标记为可安全编写脚本 http://www.olavaukan.com/2010/08/creating-an-activex-control-in-net-using-c/

我搜索错了,不是 Component COM C# 而是 C# ActiveX Control。我与 ATL COM C++ 混淆了。

谢谢

【讨论】:

    【解决方案2】:

    要在客户端获得类似这样的工作,前提是可以通过客户端计算机上的安全设置来完成,您必须注册 DLL。考虑到使您的网站正常工作的这一要求,我认为某种类型的 Windows 应用程序(winForms、WPF,甚至更新的 Silverlight)可能是一个更好的选择,因为您可以确保 COM 位(或本机位,在使用本机的情况下) ) 已安装。

    COM 的一个问题是必须注册标识符(即在注册表中)才能工作,因为这是 Windows 必须找到位的唯一指针。

    【讨论】:

    • 感谢您的回复。我怎样才能做到?我做了另一个简单的应用程序。但不起作用。 Se 2# 更新
    • 我认为问题与(安全初始化)有关。但是这个例子是 C++ msdn.microsoft.com/en-us/library/aa751977.aspx。我会找到 C# 示例。
    • 是说我不能使用类库项目吗?我必须使用 Wpf 自定义控件库项目来使其工作吗?
    • 实际业务需求是什么。不是您深思熟虑的解决方案的要求,而是“作为用户,我需要能够在点击页面时自动打印页面”或类似内容。如果您能说出实际的业务需求,那么客户端发送的代码触发的 COM 组件可能还有另一种解决方案。
    • 我的错误是将 ATL COM C++ 与 C# ActiveX 控件混淆了。并在C#中搜索COM组件,正确的是C#中的ActiveX Control。很抱歉给您带来不便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2013-10-11
    相关资源
    最近更新 更多