| 

.NET C# Java Javascript Exception

2
Hallo Leute,
wie muss eine C#-ClassLibrary aufgebaut sein, damit ich auf Methoden/Events/Properties(?) aus dieser DLL von VB6 aus zugreifen kann?
Ich weiß bereits, dass es dafür notwendig ist, die C#-DLL für COM sichtbar zu machen.
Das wars dann aber auch schon.

Vielen Dank für Eure Hilfe
Carsten
16.06.2011
Carsten Ilwig 337 1 1 6
6 Antworten
2
Über die Klasse die sichtbar sein sollen muss folgender Befehl geschrieben werden:
[ComVisible(true)]

Beispiel:
[ComVisible(true)]
public class MyClass {...}

Darüberhinaus muss in VisualStudio in den Projekteigenschaften im Reiter "Erstellen" ein Haken für den Eintrag "Für COM-Interop registrieren" gesetzt werden.
16.06.2011
HischLock 73 1 5
2
Da gibt es diesen Artikel bei Codeproject
16.06.2011
KN 1,7k 1 8
0
Hallo,

vielen Dank für die Antworten.
Das mit dem Attribut und dem "Haken" habe ich mittlerweile auch rausgefunden.
Der Artikel bei Codeprojekt sieht sehr vielversprechend aus.:-)
Den schaue ich mir jetzt genauer an.
Wenn ich nicht klar komme, melde ich mich hier wieder.

Gruß
Carsten
16.06.2011
Carsten Ilwig 337 1 1 6
1
Wenn du fertig bist, wäre eine komplette Lösung hier sicherlich für andere hilfreich.
HischLock 16.06.2011
0
Hallo,

also, trotz des Demos von Codeprojekt, komme ich einfach nicht weiter.
Ich habe folgende Klasse, die ich für COM sichtbar machen möchte:
using System;
using System.Runtime.InteropServices;

namespace ComTestCSharp
{
[Guid("F1E80D2D-72F7-434F-86AB-DFC7BF10C447"), ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComTest
{
[DispId(1)]
int AddFunction(int value1, int value2);
}

[Guid("0C216A19-E1B7-4b05-86D3-4C516BDDC041")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ComTest")]
public class ComTest : IComTest
{
[DispId(1)]
public int AddFunction(int value1, int value2)
{
return value1 + value2;
}
}
}

In den Projekteigenschaften habe ich den Haken bei "Assembly COM-sichbar machen" gesetzt. Nach dem Übersetzen habe ich die beiden Dateien ComTestCSharp.DLL und ComTestCSharp.TLB

Jetzt lege ich eine neue C#-Konsolenanwendung in VS2010 an und kopiere die beiden Dateien in den bin/Debug-Ordner.

Der Programmcode sieht wie folgt aus:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(AddFunction(5, 2));
}
[DllImport("ComTestCSharp.dll")]
private static extern int AddFunction(int value1, int value2);
}
}

Wenn ich nun das Programm starte bekomme ich bei dem Versuch die Function "AddFunction(5,2)" aufzurufen die Exception
"Der Einstiegspunkt "AddFunction" wurde nicht in der DLL "ComTestCSharp.dll" gefunden."

Was mache ich falsch?

Vielen Dank für Eure Hilfe.
Carsten
16.06.2011
Carsten Ilwig 337 1 1 6
Carsten Ilwig 337 1 1 6
0
Was du versuchst ist ein P/Invoke, anstelle von COM-Interop. Das geht so nicht :-), siehe auch

http://codekicker.de/fragen/csharp-C%23-DLL-COM-Zugriff-sichtbar-com-interop#a15150


Grüße
Maria
18.06.2011
Maria Simlinger 1,1k 1 9
0
Hallo Leute,

mittlerweile habe ich das Problem lösen können. :-)
Als erstes einmal vielen Dank an alle, die auf meine Anfrage geantwortet haben und somit auch zur Lösung meines Problems beigetragen haben.

Hier nun die komplette Lösung, falls später einmal jemand vor dem selben Problem stehen sollte:

Folgende Aufgabe galt es zu lösen:
Es sollte von einer bestehenden VB6-Anwenderung heraus auf öffentliche Eigenschaften/Methoden/Functions in einer C#-DLL zugegriffen werden.

Hier meine Lösung:
Die C#-DLL wurde unter Win7 Ultimade mit VS2010 in .NET 4.0 entwickelt.
Wichtig dabei ist, dass, wenn die C#-DLL direkt aus VS heraus für COM sichtbar gemacht werden soll, man VS mit Adminrechten startet, sonst bekommt VS keinen Zugriff auf die Registry um die DLL zu registrieren.
In diesem Fall muss auch in der Assemblyinfo.cs folgende Zeile stehen:
[assembly: ComVisible(false)]

Hier der Code für die C#-DLL (Assemblyname: VB6TestCSharp.DLL):

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ComTestCSharp
{
[Guid("F1E80D2D-72F7-434F-86AB-DFC7BF10C447")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IComTest
{
[DispId(1)]
int AddFunction(int value1, int value2);
[DispId(2)]
string GetMyProperty();
[DispId(3)]
string MyProperty { get; set; }
}

[Serializable]
[Guid("0C216A19-E1B7-4b05-86D3-4C516BDDC041")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
[ProgId("ComTest")]
public class ComTest : IComTest
{
public string MyProperty { get; set; }

public ComTest() { }

public int AddFunction(int value1, int value2)
{
return value1 + value2;
}
public string GetMyProperty()
{
MessageBox.Show("MyProperty: "+MyProperty);
return MyProperty;
}
}
}



Und hier der VB6-Code:

Function MyTest()
Dim test As Long
Dim theObj As New ComTest
test = theObj.AddFunction(5, 6)
theObj.MyProperty = "Test"
Dim strValue As String
strValue = theObj.GetMyProperty()
Exit Function
End Function




Um auf die C#-Eigenschaften zu zugreifen, muss zuvor in VB6 über den Menüpunkt 'Projekt/Verweise' ein Haken bei ' VB6TestCSharp' gesetzt werden, damit ein Verweis auf die C#-DLL in das Projekt eingebunden wird.
Sollte der Eintrag ' VB6TestCSharp' nicht in der Auflistung stehen, dann ist ein Fehler bei der Com-Registrierung der DLL aufgetreten.

Eine manuelle Registrierung kann auf folgende Weise geschehen:

regasm VB6TestCSharp.dll /tlb /CodeBase /register

Das Programm 'RegAsm' finden man unter ' C:\Windows\Microsoft.NET\Framework\v??'
Die Fragezeichen (??) stehen für die zu verwendente .NET-Version.
In einer 64-bit Umgebung muss die Datei aus dem Ordner ' C:\Windows\Microsoft.NET\Framework64\v??' verwendet werden.
30.06.2011
Carsten Ilwig 337 1 1 6

Stelle deine .net-Frage jetzt!