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?
¿Tiene su dll COM registrado en el lado del cliente? Nunca funcionará si no lo haces – yms
@yms Sí, lo hice. Me registré en Regasm MyApp.dll/codebase. – Cobaia
¿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