2011-03-30 2 views
1

J'ai un objet COM que j'essaie d'enrouler dans une classe C# afin de le rendre plus facilement disponible pour d'autres applications qui souhaitent le consommer.Comment consommer l'objet COM dans le fichier de classe ASP.NET

J'ai le code suivant qui crée une instance de l'objet COM, puis l'utilisation de la réflexion appelle la méthode pour extraire des données utilisateur. Ce code fonctionne correctement lorsqu'il est situé dans une page ASPX.

object jdObj = Server.CreateObject("jd_api.UserCookie"); 
string username = jdObj.GetType().InvokeMember("GetUserName", System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString(); 

Cependant, lorsque je déplace le code dans un fichier de classe (JD_API.cs) pour abstraire du site actuel, je ne peux plus le faire fonctionner. Par exemple, j'ai la méthode statique suivante qui est déclarée comme telle:

public static string GetUserName() { 

    object jdObj = Server.CreateObject("jd_api.UserCookie"); 
    string username = jdObj.GetType().InvokeMember("GetUserName", 
System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString(); 

    return username; 
} 

Malheureusement, l'objet serveur est limité à certaines bibliothèques ASP.NET qui sont inclus par défaut dans les applications Web, et donc le code ci-dessus était un non-go. Donc, à ce stade, j'ai décidé d'essayer de créer une instance de l'objet COM comme tel:.

public static string GetUserName() { 

    Type type = Type.GetTypeFromProgID("jd_api.UserCookie"); 
    object jdObj = Activator.CreateInstance(type); 

    string username = jdObj.GetType().InvokeMember("GetUserName", System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString(); 

    return username; 
} 

Cependant lors de l'exécution que je reçois une erreur qui dit: «Tentative de lecture ou d'écriture mémoire protégée Ceci est souvent un indication que l'autre mémoire est corrompue ".

Je ne sais pas où aller à partir d'ici. Toute aide sur la façon de créer abstraitement une instance de cet objet COM à une couche qui n'est pas dans l'application Web elle-même serait grandement appréciée. Merci!!

Répondre

1

Déclare les fonctions DLL dans une classe. Puis définissez une méthode statique pour chaque fonction DLL que vous souhaitez appeler. L'exemple de code suivant crée un wrapper nommé Win32MessageBox qui appelle la fonction MessageBox dans User32.dll chaque fois qu'une application .NET appelle la méthode Show de l'objet. Il requerre l'espace de noms System.Runtime.InteropServices.

using System; 
using System.Runtime.InteropServices; 

class Win32MessageBox 
{ 
    [DllImport("user32.dll")] 
    private static extern int MessageBox(IntPtr hWnd, String text, 
     String caption, uint type); 

    public static void Show(string message, string caption) 
    { 
     MessageBox(new IntPtr(0), message, caption, 0); 
    } 
} 

Pour l'appeler, il suffit de taper:

Win32MessageBox.Show("StackOverflow!", "my stack box"); 

La méthode où vous appelez la ligne ci-dessus n'a pas besoin d'être conscient que c'est un fait d'appeler une fonction dans une DLL non géré. Ressources: le kit de formation auto-rythmé MCTS (examen 70-536) par Tony Northrup.

0

Hove vous avez essayé usinsing interoperating

Je l'ai fait ce qui suit dans le passé (travail de mémoire afin que vous pourriez avoir besoin de jouer avec cela un peu):

  1. Faites un clic droit « Références » votre projet
  2. Sélectionnez "Ajouter Référence"
  3. Selelct l'onglet "Com"
  4. Trouvez et ajoutez votre Com Instnace

Dans votre fichier de classe

using yourComName; 

public static string GetUserName() 
{ 
     yourComName.yourComClass jdObj = new yourComClass(); 
     string username = jdObj.GetUserName(someParameters); 
     return username; 
} 

Hope this a) fonctionne et b) aide!

Questions connexes