2016-05-18 4 views
0

Ich konnte nicht ganz eine Frage dazu finden, oder ich war zu dumm, um zu verstehen, dass andere Lösungen darauf angewendet werden konnten. Hier kommt's.COM-Objekt funktioniert in der Konsole-Anwendung, aber nicht in der DLL

Ich versuche, eine DLL zu erstellen, die nur eine Funktion enthalten sollte, die andere Programmierer auf ihr Projekt verweisen können, um die Funktion zu verwenden. Die Funktion ruft einfach ein bereits laufendes Objekt ab und gibt es an den Aufrufer zurück. Es ist eine Funktion, um das laufende SAP-Objekt zu erhalten und es zurückzugeben.

DLL-Code unten

using System; 
using SAPFEWSELib; 
using SapROTWr; 

namespace SAPCon 
{ 
    public class SAPObj 
    { 
      public static GuiSession CreateNewSession() 
     { 
      SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
      object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
      object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null); 
      GuiApplication sapGuiApp = engine as GuiApplication; 
      GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection; 
      GuiSession session = connection.Children.ElementAt(0) as GuiSession; 
      int c = (connection.Children as GuiComponentCollection).Count; 
      session.CreateSession(); 

      int err = new int(); 
      int ses = new int(); 
      do 
      { 
       try 
       { 
        session = connection.Children.ElementAt(c) as GuiSession; 
        ses = session.Info.SessionNumber; 
        err = 0; 
       } 
       catch (Exception e) 
       { 
        err = e.HResult; 
       } 
      } while (err == 614); 

      return session; 
      } 
    } 
} 

Hier ist der Code aus dem Programm, das die dll

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using SAPFEWSELib; 
using SapROTWr; 
using SAPCon; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      GuiSession g; 
      g = SAPCon.SAPObj.CreateNewSession(); 

      int s; 
      s = g.Info.SessionNumber; 
      Console.WriteLine(s); 
      Console.ReadKey(); 
     } 
    } 
} 

Wenn ich den Code ganzen DLL in einer regelmäßigen Konsolenanwendung auf dem Prüfstand versucht es einwandfrei funktioniert, aber wenn ich die DLL referenziere und versuche, die Funktion zu verwenden, bekomme ich eine Ausnahme in der ersten Zeile SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); sagen, dass die Klasse nicht registriert ist.

Ich denke, das ist etwas falsch mit meiner DLL, nicht die SAP Dlls, da sie in Ordnung funktionieren, wenn aus einer Anwendung ausgeführt. Ich habe eine 32-Bit-Registrierung auf meiner DLL gemacht und es ging gut, ich versuchte eine Regsvr, aber es konnte nicht den Einstiegspunkt finden.

Was fehlt mir hier?

+0

Ihre EXE-Projekt Projekt> Eigenschaften> Build Registerkarte> Zielplattform Einstellung einige Abhängigkeiten Dateien in der verweisenden Projekt sind vermisst Angelegenheiten. –

Antwort

0

Nur wenige Dinge, die Sie in einer solchen Situation überprüfen sind wünschen können:

  1. prüfen für die richtige Architektur. Es gibt sehr Problem verursachende Option in "runnable" Typen von Projekten "Prefer 32-bit", so dass Sie denken, Sie AnyPCU ausführen, aber in Wirklichkeit erzwingen Sie x86-Architektur
  2. Überprüfen Sie, ob die Anwendung der [STAThreadAttribute] das Problem löst
  3. versuchen, beide Projekt in das gleiche Verzeichnis bauen - wenn es das Problem löst es bedeutet, dass Sie
+0

Nummer 1 hat es getan. Ich habe versucht, sowohl die DLL und ausführbare Datei auf 64 ohne Erfolg zu bauen. Aber als ich beide gezwungen habe, auf X86 aufzubauen, funktioniert es. Ich habe Nummer 2 in die Methode aufgenommen, aber es hat nichts für das 64bit getan, vielleicht hat es auch beim 32 Bit Build geholfen. danken! =) – Tocchetto

Verwandte Themen