Announcement

Collapse
No announcement yet.

C# DLL und Delphi 7

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

  • C# DLL und Delphi 7

    Hallo,

    Ist es möglich C# dll in Delphi 7 verwenden. Wenn ja, dann wie. Die C# Dll sieht z.B. so aus:
    <PRE>
    //Copyright (C) 2000 Microsoft Corporation. All rights reserved.

    // Factorial.cs
    // compile with: /target:library
    using System;

    namespace Functions
    {
    public class Factorial
    {
    public static int Calc(int i)
    {
    return((i <= 1) ? 1 : (i * Calc(i-1)));
    }
    }
    }
    </PRE>

    Danke.

  • #2
    Hallo,

    um eine C# Assembly aus Delphi 7 heraus zu verwenden, gibt es mindestens 2 Wege:

    1. Delphi 8 verpackt die C#-Assembly in einer eigenen Assembly, die den <b>Unmanaged Export</b>-Trick nutzt (das kann sonst nur noch <i>C++ Managed Extension</i>, aber nicht C#). Das folgende Beispiel demonstriert dies mit der Environment-Klasse aus dem .NET Framework:
    <pre>
    <b>library</b> D8LibExport;
    <br>
    <font color="#003399"><i>{$UNSAFECODE ON}</i></font>
    <br>
    <b>uses</b>
    SysUtils,
    Classes,
    System.Reflection;
    <br>
    <font color="#003399"><i>{$REGION 'Assembly-Attribute'}</i></font>
    ...
    <font color="#003399"><i>{$ENDREGION}</i></font>
    <br>
    <b>function</b> D8NET_UserName: <b>String</b>;
    <b>begin</b>
    Result := Environment.UserName;
    <b>end</b>;
    <br>
    <b>function</b> D8NET_DomainName: <b>String</b>;
    <b>begin</b>
    Result := Environment.UserDomainName;
    <b>end</b>;
    <br>
    <b>exports</b>
    D8NET_UserName, D8NET_DomainName;
    <br>
    <b>begin</b>
    <b>end</b>.
    </pre>
    Auf diesen "Zwitter" (.NET Assembly und klassische Win32-DLL) kann Delphi 7 auf dem normalen Weg zugreifen:
    <pre>
    <b>function</b> D8NET_UserName: PChar; <b>external</b> <font color="#9933CC">'D8LibExport.dll'</font>;
    <b>function</b> D8NET_DomainName: PChar; <b>external</b> <font color="#9933CC">'D8LibExport.dll'</font>;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>begin</b>
    ShowMessage(D8NET_UserName);
    <b>end</b>;
    <br>
    <b>procedure</b> TForm1.Button2Click(Sender: TObject);
    <b>begin</b>
    ShowMessage(D8NET_DomainName);
    <b>end</b>;
    </pre>

    2. Die C#-Implementierung wird als COM-Objekt verpackt, so dass Delphi 7 über den COM-Interop-Weg (<b>RegAsm.exe</b> <i> CSharpObj.dll /tlb:CSharpObj.tlb</i>
    ) darauf zugreifen kann:
    <pre>
    using System.Reflection;
    using System.Runtime.CompilerServices;
    //
    using System.Runtime.InteropServices;
    ...
    ...
    ...
    [assembly: ComVisible(true)]
    [assembly: ClassInterface(ClassInterfaceType.AutoDual)]
    </pre&gt

    Comment

    Working...
    X