Announcement

Collapse
No announcement yet.

.Net-Objekt von Delphi aus nutzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • .Net-Objekt von Delphi aus nutzen

    Mit C# habe ich mir ein einfaches .Net-Objekt gebaut, das ein Form mit einem Button enthält.
    <br>
    using System;<br>
    using System.Windows;<br>
    using System.Windows.Forms;<br>

    namespace NetObj<br>
    {<br>
    public class TestForm : Form<br>
    {<br>
    public Button button1;<br>
    <br>
    public TestForm()<br>
    { <br>
    initComponents();<br>
    }<br>
    <br>
    public void initComponents()<br>
    {<br>
    button1 = new Button();<br>
    Controls.Add(button1);<br>
    }<br>
    <br>
    public void ShowForm()<br>
    {<br>
    TestForm myForm = new TestForm();<br>
    myForm.Show();<br>
    }<br>
    <br>
    }<br>
    }<br>
    <br>
    Dieses .Net-Objekt soll nun von einem Delphi-Client als COM-Objekt angesprochen werden. <br>
    Solange das Formular leer ist, funktioniert das Ganze auch einwandfrei. Sobald jedoch mit der Codezeile 'Controls.Add(button1)' dem Formular einen Button hinzufügen will, bekomme ich beim Aufruf des COM-Objekt eine OLE-Exception mit der Meldung "Arithmetisches Ergenis übersteigt 32bits". Was muß ich verändern, bzw. was mache ich falsch?

  • #2
    Hallo,

    ich kann das Problem reproduzieren, habe aber nur einen schmutzigen Workaround dafür gefunden. Hier meine Schritte im Einzelnen:

    1. Neue C# Class Library, Form hinzufügen

    2. AssemblyInfo.cs:
    <pre>
    using System.Runtime.InteropServices;
    ...
    [assembly: AssemblyVersion("1.0.0.0")]
    ...
    [assembly: AssemblyKeyFile(@"..\..\OssiSoft.snk")]
    [assembly: ComVisible(true)]
    [assembly: ClassInterface(ClassInterfaceType.AutoDual)]
    </pre>
    3. Implementierung des "COM-Objekts" in .NET
    <pre>
    using System;

    namespace NETFormObj
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Class1
    {
    public Class1()
    {
    //
    // TODO: Add constructor logic here
    //
    }

    public void ShowNETForm()
    {
    Form1 aFrm = new Form1();
    aFrm.Show();
    }
    }
    }
    </pre>
    4. Implementierung des Forms:
    <pre>
    ...
    public Form1()
    {
    //
    // Required for Windows Form Designer support
    //
    try
    {
    InitializeComponent();
    }
    catch
    {
    InitializeComponent();
    }
    }
    ...
    </pre>
    Die Exception wird bereits ausgelöst, wenn nur der Text des Fensters gesetzt wird (also bei jedem Zugriff auf die GUI). Der schmutzige Workaround besteht darin, die Exception zu schlucken, da der 2. Aufruf erfolgreich ist. Verschiedene Versuche, das .NET-Objekt auf das STA zu begrenzen, haben das Problem nicht beseitigt - ich vermute aber trotzdem, dass die Ursache mit dem Apartment zusammenhängt.

    5. Aufruf in Delphi:
    <pre>
    uses NETFormObj_TLB;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    aSrv : _Class1;
    begin
    aSrv := CoClass1.Create;
    aSrv.ShowNETForm;
    end;
    </pre&gt

    Comment

    Working...
    X