.NET-Objekt (als COM-Objekt?) in anderer Applikation nutzen?

Sparks

Mitglied
(nicht sicher, ob es hier hingerhört, ggf. bitte verschieben, danke.)

Hallo zusammen,

ich möchte ein .NET-Objekt (Visual C#) in einer anderen Applikation aufrufen.
Konkret geht es um eine Art Tages-Kalendercontrol mit bestimmten, optisch Outlook-ähnlichen, Eigenschaften...
Dieses soll in einer weiteren Anwendung (Gupta-SQLWindows (ja, gibt es tatsächlich immer noch! ;) )) -- per COM-Objekt? -- aufgerufen werden.

Nun ist ja generell die Erstellung eines COM-Objekts in .NET möglich (Output type: "class libraray" und "make assembly COM-visible"). Wie geht es dann weiter? Wie schreibe ich die sog. Wrapper-Funktion?

Aber: Das scheint auch "nur" dann zu funktionieren, wenn keine grafischen Objekte (Fenster, Buttons usw.) im .NET-Projekt enthalten sind?! Oder mache ich etwas falsch?

Dazu habe ich auch diese zwei Links, die -- so wie ich es verstehe -- ähnliches aussagen:
http://support.microsoft.com/?id=311334
http://support.microsoft.com/kb/839076/

Ich wüsste also gerne, ob es generell möglich ist, ein in .NET (vcs) erstelltes COM-Objekt inkl. Fenster und Buttons usw. in einer anderen Entwicklungsumgebung zu nutzen und wenn ja, wie ich ein solches COM-Objekt erstelle.

Vielen Dank, Gruß,
Sparks
 
Hi,

Soweit mir bekannt, muss zusätzlich jede Klasse, Funktion, ... zusätzlich als COM-Visible markiert werden, die du auf COM-Seite auch nutzen willst.
Die ganze Assembly musst du mit regasm.exe registrieren.

C#:
[ComVisible(true)]
class MyClass
{
   public MyClass()
   {
      //Insert code here.
   }
   
   [ComVisible(true)]
   public int MyMethod(string param) 
   {
      return 0;
   }

   public bool MyOtherMethod() 
   {
      return true;
   }

   [ComVisible(true)]
   public int MyProperty
   {
      get
      {
         return MyProperty;
      }
   }
}

Infos u.a. hier: http://msdn.microsoft.com/library/d...eropServicesComVisibleAttributeClassTopic.asp
 
So sieht es bei mir schon aus:

NET.dll:


unit Envisys.TestMich;
interface
uses System.Runtime.InteropServices;
type
[ComVisible(true)]
TestMich = class
private
{ Private-Deklarationen }
strict protected

public
constructor Create;
class function GetA(): Integer; static;
end;

implementation
constructor TestMich.Create;
begin
inherited Create;

// TODO: Hier die Konstruktorlogik einfügen
end;

[ComVisible(true)]
class function TestMich.GetA: Integer;
begin
result := 5;
end;
end.



dann hab ich in dem Verzeichniss wo die Anwendung liegt regasm.exe netstuff.dll aufgerufen. Nun will ich sie in delphi (Win32) nutzen:


unit Test;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
ComObj;

const NET_DLL='NetStuff.dll';
function GetA(): integer; stdcall; external NET_DLL;

type
TForm1 = class(TForm)
LabelName: TLabel;
procedure Button1Click(Sender: TObject);

private

public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
LabelName.Caption:= IntToStr(GetA());
end;

end.



Was mach ich nur falsch?
 
Hi

1. Bitte bearbeite deinen Post und setz den SourceCode in Code-Tags.
2. Um welche Sprache handelt es sich hier eigentlich?
3. Was ist denn das Problem? Wie äußert es sich?
4. regasm.exe aufgerufen?
 
Ich hab nicht so viel Zeit gehabt, aber inzwischen schaffe ich wenigstens, eine in .NET generierte dll in der SQLWindows Umgebung zu nutzen -- leider immer noch ohne Fensterobjekte.
Falls es jemand interessiert, hier ist die Klasse meines Projekts:

C#:
using System;
using System.Runtime.InteropServices;

namespace TeamDeveloperTest
{
	[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
	public interface INETInterface 
	{
		string GetString();
	}

	public class Class1:INETInterface
	{	
		public string GetString()
		{
			return "Glückwunsch! Du hast hiermit Zugang zu .NET Code.";
		}
	}
}
Das wird dann wie von niggo beschrieben compiliert.

Das Einbinden der dll in SQLWindoof (TeamDeveloper) sieht dann so aus (im Prinzip):

Code:
Classes:
   Functional Class: TeamDeveloperTest_INETInterface
	Description:
	Functions
		Function: GetString
			Parameters
				Receive String: returnValue
			Static Variables
			Local variables
				Boolean: tmpret
			Actions
				(... )

(...)
Variables:
   TeamDeveloperTest_INETInterface: cfTest
   String: strVariable
(...)
Actions:
      If cfTest.CreateObject(  "TeamDeveloperTest.Class1" )
         Call cfTest.GetString( strVariable )
         // strVariable enthält jetzt den Text: "Glückwunsch! Du hast ..."
Ich setze den thread noch nicht auf erledigt, da ich immer noch hoffe, dass mir jemand den entscheidenden Tipp geben kann, wie ich auf diese Weise auch eine dll mit einem Fensterobjekt oder einem Dialog einbinden kann (das geht bisher noch nicht :confused: )
Trotzdem schonmal danke an niggo, das hat schon was geholfen :)
 

Neue Beiträge

Zurück