En cours d'exécution C# Interop Contrôle ActiveX sur le Côté Client de ASP.NET
Je suis en train de faire une application web simple à l'aide de ASP.NET et Interop COM.
La principale question est: Comment faire Interop COM travaille à côté client?
Je suis à l'Aide de:
IIS de Windows Server 2008
C# Interop COM - Visual Studio 2010
Asp .NET - Visual Studio 2010
D'après ces articles
http://msdn.microsoft.com/en-us/library/aa479302.aspx
et http://msdn.microsoft.com/en-us/magazine/cc301832.aspx.
J'ai essayé d'utiliser le composant sur le côté client de deux façons:
Première:
<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>
Deuxième:
dans .aspx
<object id="Obj" codebase="MyApp.dll#version=1,0,0,0" classid="clsid:C6659361-1625-4746-931C-36014B146679" VIEWASTEXT></object>
et dans .cs fichier:
RegisterClientScriptBlock("showSaveMessage", "<script language=\"JavaScript\"> Obj.PrintHi(); </script>");
À côté serveur j'ai ouvert Internet Explorer et fonctionne comme un charme. Mais à côté client apparaît: cet Objet ne gère pas cette propriété ou cette méthode.
J'ai aussi essayé:
<%
set Obj = CreateObject("MyApp.MyClass")
Obj.PrintHi
%>
Fonctionne pour les deux côtés, mais seulement d'appel MyApp.dll installé sur le côté serveur.
À l'aide de la "balise object' est la manière correcte? Est-il une autre façon d'utiliser COM à côté client? Comment faire pour configurer IIS pour éviter cet Objet ne gère pas cette propriété ou cette méthode à côté client?
Merci d'Avance
1# mise à Jour
J'ai créer ASP.NET C# dans Visual Studio 2010 sur Windows XP 32bits utilise un C# Interop COM.
Sur ma machine "Windows XP" je ne Début de Débogage et IE page s'ouvre avec ma demande. Les travaux de cette.
J'ai donc copié le projet pour Windows Server 2008 et a ajouté que le projet dans IIS. Lorsque j'exécute IIS s'ouvre IE et cela fonctionne.
Après cela, j'ai essayé de faire le test final, j'ai Donc ouvert l'IE sur Windows XP et tapez l'adresse que Windows générées par le Serveur, fine, je peux voir la page, mais quand je clique pour l'exécution de la fonction, s'affiche: "l'Objet ne gère pas cette propriété ou méthode".
Serveur:
Windows 2008 R2 64bits
La version de IE 9
Client:
Windows XP 32bits
La version de IE 8
2# mise à Jour
J'ai essayé un autre test
J'ai fait un nouveau Composant 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";
}
}
}
Dans AssemblyInf.cs a [assembly: ComVisible(true)]
J'ai fait une autre application 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>
- Je modifier les paramètres d'internet explorer pour afficher ActiveX pas confiance et exécuter le programme.
Dans windows XP qui fonctionne, Dans Windows Server fonctionne. Mais lorsque vous essayez d'appeler la page à partir de windows XP Windows XP appeler Windows 2008 page" s'affiche: "cet Objet ne gère pas cette propriété ou cette méthode"
Si sur le côté client, je ne regasm /u MyCOM.dll
l'IE invité à installer le composant.
La dll est stocké dans le C:\WINDOWS\Downloaded Program Files
, si j'essaie d'installer plus d'une fois, crée un dossier appelé CONFLICT.1
.. C:\WINDOWS\Downloaded Program Files\CONFLICT.1
très étrange. J'ai aussi essayé d'enregistrer cette téléchargé composant avec regasm MyCOM.dll /codebase
.
Serveur .NET: C:\Windows\Microsoft.NET\Framework\v4.0.30319
Client .NET: C:\Windows\Microsoft.NET\Framework\v4.0.30319
Pourquoi ne pas travailler? Il ne fait aucun sens.
3# mise à Jour
J'ai couru sur une autre machine "Client". - Je modifier les paramètres d'internet explorer pour exécuter pas à l'abri de l'ActiveX. Et ses Œuvres, d'Après ce que j'ai essayé sur Windows XP Client j'ai réinitialisé les paramètres et configurer à nouveau exécuter un contrôle ActiveX pas à l'abri. Les Travaux De Cette.
Maintenant, le problème est lié à Installer Interop COM à partir d'ASP. J'ai essayé de l'installer mais apparaît: cet Objet ne gère pas cette propriété ou cette méthode. Je pense que c'est lié à Safe Inicialization
. J'ai trouvé ce lien: http://msdn.microsoft.com/en-us/library/aa751977.aspx#iobjsafe mais est pour le C++, Est-il C# exemples?
4# mise à Jour
J'ai essayé d'utiliser:
public class ClassTest : System.Windows.Forms.UserControl, IClassTest
J'ai aussi essayé de faire un .fichier cab, mais ne fonctionne pas.
Ai-je à faire de projet wpf? Pourquoi cela ne fonctionne pas?
Oui, je l'ai fait. Je l'ai enregistré avec regasm MyApp.dll /base de code.
Est votre "côté client" d'une version 64 bits de l'OS? si elle l'est, peut-être vous avez besoin d'enregistrer votre fichier dll pour les deux architectures. Voir la réponse à cette question, DONC pour plus de détails.
Mon "côté client" est Windows XP 32bits. Je n'ai pas le dossier "Framework64' 🙁
Dans IIS j'ai marqué dans la V4.0.NET pour activer l'application 32bits, mais le même message s'affiche "cet Objet ne gère pas cette propriété ou cette méthode" côté client. Merci
OriginalL'auteur Cobaia | 2011-08-04
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la solution: Déployer C# ActiveX dans un taxi pour Internet Explorer utilisation
Je n'ai suivantes:
Forte nommées par l'assemblée.
Créé un fichier INF
Créé un MSI à l'aide de Visual Studio 2010 "Projet d'Installation de modèle".
Créé un fichier CAB à l'aide "Makecab.exe"
Voir ce lien pour les détails de la marque comme sécurisés pour l'écriture de scripts
http://www.olavaukan.com/2010/08/creating-an-activex-control-in-net-using-c/
J'étais à la recherche de mal, ne pas se Composant COM C# et oui C# Contrôle ActiveX. Je confonds avec ATL COM C++.
Merci
OriginalL'auteur Cobaia
Pour obtenir quelque chose de travailler comme cela sur le côté client, à condition qu'il peut être fait avec les paramètres de sécurité sur l'ordinateur client, vous devez avoir la DLL enregistrée. Compte tenu de cette exigence à faire de votre site de travail, je pense à une application windows d'un certain type (winForms, WPF, même les plus récents Silverlight) pourrait être une meilleure option que vous pouvez assurez-vous que le COM bits (natif de bits, dans des cas où l'utilisation native) sont installés.
Un problème avec COM est l'identifiant doit être enregistré (c'est à dire dans le registre) à travailler, car c'est le seul pointeur Windows a trouver les bits.
Je pense que le problème a à voir avec (safe inicialization). Mais l'exemple était en C++ msdn.microsoft.com/en-us/library/aa751977.aspx. Je vais trouver le C# exemples.
Disons que je peux pas utiliser le Projet de Bibliothèque de classes? Ai-je utiliser Wpf Contrôle Personnalisé de Projet de Bibliothèque pour le faire fonctionner?
Quelle est l'exigence de l'entreprise. Pas le requrement avec votre pensée solution, mais "en tant Qu'utilisateur, j'ai besoin d'être en mesure d'avoir une impression de la page automatiquement quand j'ai frappé à la page" ou similaire. Si vous pouvez préciser le réel exigence de l'entreprise, il est probable qu'une autre solution à un composant COM sur le côté client déclenchée à partir d'un code envoyé par le serveur.
Mon erreur a été de confondre ATL COM C++, le C# Contrôle ActiveX. Et la recherche de composants COM en C#, le bon est un Contrôle ActiveX dans C#. Désolé pour la gêne occasionnée.
OriginalL'auteur Gregory A Beamer