13

Delphi プログラム内から .​​NET コードを使用することを検討していましたが、.net アセンブリと定義済み関数を使用してプログラムを拡張可能にする必要があります (通常の DLL は既にサポートしています)。

オンラインでたくさん検索した後、 Managed-VCLを見つけましたが、必要なものに 250 ドルを支払う準備ができていません。コードが不完全で機能しないニュースグループもいくつか見つけました。

Win32 用の Delphi 2007 を使用しています。定義済みのパラメーターを使用してアセンブリから関数を動的に実行するには、何を使用できますか?

何かのようなもの:

procedure ExecAssembly(AssemblyFileName:String; Parameters: Variant);

任意のアセンブリ (おそらく特定のフォルダー内のすべてのアセンブリ) を読み込めるようにする必要があることを追加したいので、C# ラッパーの作成が機能しない可能性があります。

4

7 に答える 7

7

Jediコードライブラリ(JCL)(無料)には、クラスTJclClrHostを含むJclDotNet.pasがあり、おそらく必要なことを実行します。

  TJclClrHost = class(TJclClrBase, ICorRuntimeHost)
  private
    FDefaultInterface: ICorRuntimeHost;
    FAppDomains: TObjectList;
    procedure EnumAppDomains;
    function GetAppDomain(const Idx: Integer): TJclClrAppDomain;
    function GetAppDomainCount: Integer;
    function GetDefaultAppDomain: IJclClrAppDomain;
    function GetCurrentAppDomain: IJclClrAppDomain;
  protected
    function AddAppDomain(const AppDomain: TJclClrAppDomain): Integer;
    function RemoveAppDomain(const AppDomain: TJclClrAppDomain): Integer; 
  public
    constructor Create(const ClrVer: WideString = '';
      const Flavor: TJclClrHostFlavor = hfWorkStation;
      const ConcurrentGC: Boolean = True;
      const LoaderFlags: TJclClrHostLoaderFlags = [hlOptSingleDomain]);
    destructor Destroy; override;
    procedure Start;
    procedure Stop;
    procedure Refresh;
    function CreateDomainSetup: TJclClrAppDomainSetup;
    function CreateAppDomain(const Name: WideString;
      const Setup: TJclClrAppDomainSetup = nil;
      const Evidence: IJclClrEvidence = nil): TJclClrAppDomain;
    function FindAppDomain(const Intf: IJclClrAppDomain; var Ret: TJclClrAppDomain): Boolean; overload;
    function FindAppDomain(const Name: WideString; var Ret: TJclClrAppDomain): Boolean; overload;
    class function CorSystemDirectory: WideString;
    class function CorVersion: WideString;
    class function CorRequiredVersion: WideString;
    class procedure GetClrVersions(VersionNames: TWideStrings); overload;
    class procedure GetClrVersions(VersionNames: TStrings); overload;
    property DefaultInterface: ICorRuntimeHost read FDefaultInterface implements ICorRuntimeHost;
    property AppDomains[const Idx: Integer]: TJclClrAppDomain read GetAppDomain; default;
    property AppDomainCount: Integer read GetAppDomainCount;
    property DefaultAppDomain: IJclClrAppDomain read GetDefaultAppDomain;
    property CurrentAppDomain: IJclClrAppDomain read GetCurrentAppDomain;
  end;
于 2008-11-19T07:45:10.023 に答える
7

CLRを自分でホストすることは、それほど難しいことではありません(特に、単一のAppDomainを使用している場合)。COMベースのホスティングAPIを使用して、ランタイムの起動、アセンブリのロード、オブジェクトの作成、およびそれらのメソッドの呼び出しを行うことができます。

オンラインには多くの情報があります。たとえば、「共通言語ランタイムのホスティング」に関するMSDNドキュメントです。新しい家

于 2008-11-03T15:12:27.917 に答える
6

Delphiの.Netとの相互運用はピクニックではないことを、直接の経験からお伝えできます。私は.Netの人ですが、しばらくの間.NetとDelphiのショップで働いていました。.Net(WinFormsおよびWPF)で記述されているが、Delphiによって呼び出されたいくつかのプロジェクトを管理しました。すべての新製品が.Netで記述されていたため、Delphiの担当者はDelphiが.Netライブラリを呼び出すための相互運用レイヤーを作成していました。それは私たちにとって問題でした(そしてこれらは優れたDelphi開発者でした)。相互運用を行うために優れたサードパーティのライブラリを購入できたとしたら、それだけの価値はありませんでした。Delphiから.Netへの相互運用に関する問題の作成とデバッグに数千ドルを費やしたに違いありません。

そのManaged-VLCライブラリをテストドライブに使用して、どのように機能するかを確認します。それがその広告に忠実であるならば、それは簡単に250ドルの価値があります。

于 2008-11-03T15:01:57.283 に答える
4

JCLを使用してDelphiでCLRをホストするエンドツーエンドの例については、私の質問を参照してください。

于 2010-01-12T21:13:25.420 に答える
3

私はこれとまったく同じ問題を抱えていました。私は Delphi ショップで働いていましたが、.NET と C# を使用して従来の Delphi アプリに機能を追加したいと考えていました。Managed-VLC を調べたところ、重大な問題があると感じたのでスキップすることにしました。ここでもっと簡単なものを見つけました: Delphi.NET。注: これは、.NET でネイティブに実行されるバージョンの Delphi ではありません。これは、従来の Delphi アプリが COM とリフレクションを介して .NET 機能にアクセスできるようにするオープン ソース プロジェクトです。古いものですが、COM を使用しているので魅力的に動作します。.NET 2.0 および 3.5 で動作することを確認します。数日で、.NET DLL を従来の Delphi 5 アプリケーションに完全に統合することができました。上司は私がスーパーヒーローだと思っていました。幸運を!

于 2008-11-03T17:57:08.083 に答える
2

Delphiでは、.NetクラスをCOMオブジェクトとして使用できます。

  • C#でアセンブリを作成する
  • アセンブリ用のタイプライブラリを作成する
  • Delphiでタイプライブラリをインポートする

これで、タイプライブラリにエクスポートされた.Netアセンブリからクラスにアクセスできます。

于 2008-11-03T15:01:21.060 に答える
2

Delphi for .Netおよびアンマネージドエクスポートを使用できます。これは、リバースP/Invokeとも呼ばれます。

これにより、基本的に、.Netフレームワークに完全にアクセスできる.Net .dllを作成できますが、.dllの場合と同じように、com相互運用機能のオーバーヘッドなしで、任意の母国語でロードできます。

簡単な例を次に示します。http: //cc.codegear.com/Item/22688

于 2008-11-03T18:39:38.093 に答える