Laden...

Probleme mit COM-Interop

Erstellt von f.ritz vor 18 Jahren Letzter Beitrag vor 17 Jahren 3.940 Views
f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren
Probleme mit COM-Interop

Hallo zusammen!

Ich weiss dass das Thema - "COM-Interop" schon tausend mal besprochen wurde. Leider funktioniert es bei mir aber immer noch nicht.

Mein Vorgehen:

  1. Schlüsselpaar anlegen : sn -k TestKeyPair.snk
  2. Ins Projekt einfügen: [assembly: AssemblyKeyFile("TestKeyPair.snk")]
  3. Im GAC registrieren : gacutil /i MyInterop.dll
  4. .NEt als COM registrieren : REGASM MyInterop.dll /tlb:com.MyInterop.tlb

Auf die DLL möchte ich in MS Navision zugreifen.

In Navision ist diese auch sichtbar, soweit ich aber auf diese zugreifen möchte, bekomme ich folgende Fehlermeldung:

Für das OLE Control oder den Automation Server GUID={.....}1.0:{.....}:MyLibrary.MyClass konnte keine Instanz erstellt werden.
Prüfen Sie, ob OLE Controloder Automation Server korrekt installiert und registriert wurde.

Ich bin komplett nach dem Verfahren unter diesen Artikel nachgegangen: http://www.codeproject.com/csharp/ManagedCOM.asp. Der beiliegende Beispiel funktioniert auch wunderbar.

Woran kann es also liegen?

S
8.746 Beiträge seit 2005
vor 18 Jahren

Offenbar will Navision das COM-Objekt als Automation Server laden (späte Bindung). Dazu muss im COM-Objekt das IDisplatch-Interface implementiert werden. Das ist eine Schnittstelle, die zur Laufzeit über die anderen Schnittstellen des Objektes Auskunft gibt.

http://www.codeproject.com/dotnet/nettocom.asp

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

Das habe ich eigentlich schon gemacht.

Ich habe aber eine andere Vermutung. Klassenbibliothek die ich schreibe nutzt auch andere Bibliotheken (DLLs), diese DLLs sind aber nicht GAC vorhanden.

Müssen diese vielleicht auch registriert werden?

B
483 Beiträge seit 2005
vor 18 Jahren

Hallo,
kriege den gleichen Fehler,
hat jemand eine Lösung?

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly:AssemblyKeyFile("AS400.snk")]

namespace OleDbAS400Connection
{
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface _AS400
    {
        [DispId(1)]
        bool Run(string conn);
    }

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
    [ClassInterface(ClassInterfaceType.None)]

    public class AS400 : _AS400
    {
        public OleDbConnection od;
        public AS400()
        {
        }
        		
		
		
        public bool Run(string conn)
        {
            try
            {
                 od=new OleDbConnection();
                od.ConnectionString=conn;
                od.Open();
                od.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

Gruss,
Boris

B
483 Beiträge seit 2005
vor 18 Jahren

Keine Ideen?

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 17 Jahren

Ich habe nun mein Code folgend abgeändert, so dass jetzt alles funzt und so sieht es aus:


using System;
using System.Runtime.InteropServices;

[ClassInterface(ClassInterfaceType.AutoDual)] //Ermöglicht Verwendung von Methoden und Properties in Navision
[Guid("9859A01F-F3EE-4662-B5B1-3D74523AAC1F")]
public class COMInteropClass : MarshalByRefObject
{
....
}

Eintrag in AsswemblyInfo.cs:

[assembly: AssemblyKeyFile("keey.snk")]