2011-08-04 12 views
5

Estoy intentando hacer una aplicación web simple usando ASP.NET e Interop COM.Ejecutando C# Interop Control ActiveX en el lado del cliente desde ASP.NET

La pregunta principal es: ¿Cómo hacer que Interop COM funcione en el lado del cliente?

estoy usando:
IIS de Windows Server 2008
C# interoperabilidad COM - Visual Studio 2010
Asp .Net - Visual Studio 2010

Después de ver estos artículos
http://msdn.microsoft.com/en-us/library/aa479302.aspx
y http://msdn.microsoft.com/en-us/magazine/cc301832.aspx.
He intentado utilizar el componente en el lado del cliente de dos maneras:

Primeros:

<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> 

Segundo: en .aspx

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

y en el archivo .cs:

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

En el lado del servidor, abro Internet Explorer y funciona como un amuleto. Pero en el lado del cliente aparece: Object no admite esta propiedad o método.

También probé:

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

    Obj.PrintHi 
%> 

funcione para ambos lados, pero sólo llamar MyApp.dll instalado en el lado del servidor.

¿Usar "etiqueta de objeto" es la forma correcta? ¿Hay alguna otra manera de usar COM en el lado del cliente? ¿Cómo configurar IIS para evitar Object no admite esta propiedad o método en el lado del cliente?

Gracias de antemano

1 # Actualización de

que crean ASP.NET C# en Visual Studio 2010 en 32 bits de Windows XP que utiliza un C# interoperabilidad COM. En mi máquina "Windows XP" Comienzo la depuración y la página IE se abre con mi aplicación. Esto funciona.
Así que copié el proyecto a Windows Server 2008 y agregué el proyecto en IIS. Cuando ejecuto IIS abre IE y esto funciona.

Después de esto traté de hacer la prueba final, entonces abro el IE en Windows XP y escribo la dirección que generó Windows Server, está bien, puedo ver la página, pero cuando hago clic para ejecutar la función, aparece: "Objeto no admite esta propiedad o método ".

Servidor:
de Windows 2008 de 64 bits R2 versión
IE 9

Cliente:
32bits de Windows XP versión
IE 8

2 # Actualización de

he intentado otra prueba

hice un nuevo componente 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"; 
     } 
    } 
} 

En AssemblyInf.cs ha [assembly: ComVisible(true)]

hice otra aplicación 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> 

I Chang La configuración de IE para mostrar ActiveX no confía y ejecuta el programa. En Windows XP funciona, en Windows Server funciona. Pero cuando intenta llamar a la página desde Windows XP aparece "Windows XP, llame a la página de Windows 2008": "El objeto no admite esta propiedad o método"

Si en el lado del cliente hago regasm /u MyCOM.dll, el IE pidió instalar el componente. El DLL se almacena en el C:\WINDOWS\Downloaded Program Files, si intento instalar más de una vez, crea una carpeta llamada CONFLICT.1 .. C:\WINDOWS\Downloaded Program Files\CONFLICT.1 muy extraño. También traté de registrar este componente descargado con regasm MyCOM.dll /codebase.

servidor .NET: C:\Windows\Microsoft.NET\Framework\v4.0.30319
cliente .NET: C:\Windows\Microsoft.NET\Framework\v4.0.30319

Por qué no funciona? No tiene sentido.

3 # Actualización de

que corrió en otra máquina "Cliente". Cambio la configuración de IE para ejecutar ActiveX no seguro. Y funciona, después de esto probé Windows XP Client reinicié las configuraciones y las configuré nuevamente para ejecutar ActiveX no seguro. Esto funciona.

Ahora el problema está relacionado con la Instalación de interoperabilidad COM desde ASP. Intenté instalar pero aparece: Object no admite esta propiedad o método. Creo que está relacionado con Safe Inicialization. Encontré este enlace: http://msdn.microsoft.com/en-us/library/aa751977.aspx#iobjsafe pero es para C++, ¿Hay ejemplos de C#?

4 # Actualización de

Traté de usar:
public class ClassTest : System.Windows.Forms.UserControl, IClassTest
También he tratado de hacer un archivo .cab, pero no funciona.

tengo yo que hacer proyecto WPF? ¿Por qué esto no funciona?

+0

¿Tiene su dll COM registrado en el lado del cliente? Nunca funcionará si no lo haces – yms

+0

@yms Sí, lo hice. Me registré en Regasm MyApp.dll/codebase. – Cobaia

+0

¿Su "lado del cliente" es un sistema operativo de 64 bits? si es así, tal vez necesite registrar su dll para ambas arquitecturas. Ver [esta respuesta en SO] (http://stackoverflow.com/questions/372140/c-com-dll-do-i-use-regasm-or-regsvr32/372197#372197) para más detalles. – yms

Respuesta

3

he encontrado la solución: Deploy C# ActiveX in a CAB for Internet Explorer use

hice lo siguiente:

con nombre del conjunto.
Se creó un archivo INF
Se creó una MSI con la plantilla "Proyecto de configuración" de Visual Studio 2010.
creado un archivo CAB utilizando "Makecab.exe"

Vea este enlace para obtener más información al marcan como seguros para scripts http://www.olavaukan.com/2010/08/creating-an-activex-control-in-net-using-c/

que estaba buscando mal, no es componente COM C# y C# sí ActiveX Control. Lo confundo con ATL COM C++.

Gracias

0

Para obtener algo que funcione así en el lado del cliente, siempre que se pueda hacer con la configuración de seguridad en la máquina del cliente, debe tener la DLL registrada. Teniendo en cuenta este requisito para hacer que su sitio web funcione, creo que una aplicación de Windows de algún tipo (winForms, WPF, incluso Silverlight más reciente) podría ser una mejor opción ya que puede asegurarse de que los bits COM (o bits nativos, en los casos en que se usa) están instalados.

Un problema con COM es que el identificador debe registrarse (es decir, en el registro) para funcionar, ya que es el único puntero que Windows tiene para encontrar los bits.

+0

Gracias por responder. ¿Cómo puedo hacer? ¿Hago otro simp? le aplicación. Pero no funciona. Se 2 # Update – Cobaia

+0

Creo que el problema tiene que ver con (inicialización segura). Pero el ejemplo estaba en C++ http://msdn.microsoft.com/en-us/library/aa751977.aspx. Encontraré ejemplos de C#. – Cobaia

+0

¿Dicen que no puedo usar Class Library Project? ¿Tengo que usar Wpf Custom Control Library Project para que funcione? – Cobaia

Cuestiones relacionadas