Запуск ActiveX C # Interop Control на стороне клиента из ASP.NET - PullRequest
5 голосов
/ 04 августа 2011

Я пытаюсь создать простое веб-приложение с использованием ASP.NET и Interop COM.

Основной вопрос: как заставить Interop COM работать на стороне клиента?

Я использую:
IIS Windows Server 2008
C # Interop 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 и работает как шарм. Но на стороне клиента появляется: Объект не поддерживает это свойство или метод.

Я тоже пробовал:

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

    Obj.PrintHi
%>

Работает для обеих сторон, но вызывает только MyApp.dll, установленный на стороне сервера.

Использование 'тега объекта' является правильным способом? Есть ли другой способ использовать COM на стороне клиента? Как настроить IIS, чтобы избежать Object не поддерживает это свойство или метод на стороне клиента?

Заранее спасибо

1 # Обновление

Я создаю ASP.NET C # в Visual Studio 2010 на Windows XP 32бит, который использует C # Interop COM. На моем компьютере "Windows XP" я начинаю отладку, и открывается страница IE с моим приложением. Это работает.
Поэтому я скопировал проект в Windows Server 2008 и добавил проект в IIS. Когда я запускаю IIS, открывается IE, и это работает.

После этого я попытался выполнить окончательный тест, поэтому я открываю IE в Windows XP и набираю адрес, сгенерированный Windows Server, хорошо, я вижу страницу , но когда я щелкаю, чтобы запустить функцию, появляется сообщение: «Объект не поддерживает это свойство или метод».

Сервер:
Windows 2008 R2 64 бит
IE версия 9

Клиент:
Windows XP 32bit
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 небезопасно. Это работает.

Теперь проблема связана с установкой Interop COM из ASP. Я попытался установить, но появляется: Объект не поддерживает это свойство или метод. Я думаю, что это связано с 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? Почему это не работает?

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Я нашел решение: Развертывание C # ActiveX в CAB для использования в Internet Explorer

Я сделал следующее:

Сборка со строгим именем.
Создан INF-файл
Создан MSI с использованием шаблона «Проект установки» Visual Studio 2010.
Создан CAB-файл с использованием «Makecab.exe»

См. Эту ссылку для получения подробной информации о том, чтобы пометить ее как безопасную длясценариев http://www.olavaukan.com/2010/08/creating-an-activex-control-in-net-using-c/

Я искал неправильно, не является компонентом COM C # и да C # ActiveX Control.Я путаю с ATL COM C ++.

Спасибо

0 голосов
/ 05 августа 2011

Чтобы что-то работало на стороне клиента, при условии, что это можно сделать с настройками безопасности на клиентском компьютере, необходимо зарегистрировать DLL.Учитывая это требование, чтобы ваш веб-сайт работал, я думаю, что Windows-приложение некоторого типа (winForms, WPF, даже более новый Silverlight) может быть лучшим вариантом, так как вы можете убедиться, что биты COM (или собственные биты, в случаях, когда используются собственные) установлены.

Одна проблема с COM заключается в том, что идентификатор должен быть зарегистрирован (т. е. в реестре) для работы, так как это единственный указатель, который Windows должна находить в битах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...