できればC#でDLLを作成する必要のあるプログラムがあります。プログラムはDelphiで記述されており、コーディングするインターフェイスファイルがあります。インターフェイスはstdcall呼び出し規約を使用します。
インターフェイスに準拠し、Delphiアプリケーションで使用できるC#DLLを作成することは可能ですか?
C#DLLをstdcallインターフェイスメソッドにコーディングする方法を示すサンプルコードはありますか?
できればC#でDLLを作成する必要のあるプログラムがあります。プログラムはDelphiで記述されており、コーディングするインターフェイスファイルがあります。インターフェイスはstdcall呼び出し規約を使用します。
インターフェイスに準拠し、Delphiアプリケーションで使用できるC#DLLを作成することは可能ですか?
C#DLLをstdcallインターフェイスメソッドにコーディングする方法を示すサンプルコードはありますか?
これは純粋な C# では不可能ですが、これはアンマネージ エクスポート テーブルを C# ライブラリに追加する方法を示す記事で、これを他の言語で使用できます。Blitz への参照の大群があなたを先延ばしにするべきではないことに注意してください - それらは著者自身の文脈に関連しており、基本的な概念とそれがどのように機能するかには何の関係もありません.
Brian Long の 1 つの会議論文にもセクションがあります。皮肉なことに、Delphi.Net は、C# がサポートしていないにもかかわらず、実際にはアンマネージ エクスポートを直接サポートしていました。これが Delphi Prism にも当てはまるかどうかはわかりません。
私は以前にこの道をたどったことがあります。私が選んだ解決策は、新しいC# アセンブリを作成することでした (後にこれを Prism に移植しました)。API 呼び出しをより単純なものにブラック ボックス化することで、相互運用の障壁を越えて処理しなければならないクラスの数を減らすことができたことがわかりました。
私はHydraを見ましたが、私がやろうとしていたことはやり過ぎでした.netアセンブリで提示されたサードパーティのSDKにアクセスしてデータを処理しました。アプリケーションに機能 (GUI オブジェクトなど) を組み込むことを検討している場合は、Hydra について検討する必要があります。
システムの非常に初期のバージョンでは Managed.VCL を使用しましたが、後で展開がより簡単で安定した Prism/C# com 相互運用アプローチのためにそれを放棄しました。
DelphiPrismニュースグループでRobertGieseckeからの投稿を見つけました。その中で、彼は、属性を追加するだけで.NetDLLから任意の関数をエクスポートできるソリューションに追加できるプロジェクトを発表していDllExport
ます。と同じようにマーシャリングをサポートしますDllImport
。彼はPrismプロジェクトでそれを示していますが、C#クラスでも機能すると思います。投稿は3月に行われたため、添付ファイルが引き続き利用できるかどうかはわかりません。Prismの5月のリリースでは、それ自体が管理されていないエクスポートをサポートしているため、このようなツールは不要になります。
ヒドラを見てみよう
好奇心から、C# でネイティブ アプリケーションから使用されることを意図した .dll を作成したいと考えているのはなぜですか?
マネージ C++、Delphi for .Net、そして現在は Delphi Prism はすべて、アンマネージ エクスポートを使用してすぐに使用できるようになっています。設計上、C# と VB.net はそうではありません。理由がわからない。しかし、Cobus が述べたように、これをハッキングすることができます。ご自身の責任で行ってください。
RemObjects の Hydra に加えて、AToZed は CrossTalk を導入しています。
アセンブリ (=C# DLL) を COM にアクセスできるようにする必要があります。これは Interop と呼ばれます。
必要な操作を実行するための技術的背景とユーティリティについて説明しているMSDN の記事「アセンブリからタイプ ライブラリへの変換」および「COM 用アセンブリのパッケージ化」を参照してください。
ここでは、Delphi アプリは .NET ベースのアプリではないため、Win32 プロセスで .NET ランタイムをホストする必要があると想定しています。
CorBindToRuntimeEx は、.NET ランタイムを保持する MSCorEE.dll 内の関数です。それを使用すると、ランタイムをホストし、その中にオブジェクトを作成してそれらと対話できます。
これを直接行うことはできないと確信しています。C++/CLI でレイヤーを作成するか、C# コードを ActiveX インターフェイスとして公開する必要があります。しかし、その 2 番目のオプションは、インターフェイスに合わない場合があります。
これは直接可能ではありません。C# はマネージド コードです。これは、Delphi が直接提供できなかった環境を、機能させるために非常に特殊な実行環境が必要であることを意味します。関数のアドレスと呼び出し規約を見つけて呼び出すだけの C とは異なります。
ただし、Delphi アプリケーション(またはその他の Windows アプリケーション)内で共通言語ランタイムをホストすることは可能です。これを行う方法がわかりません。私はそれが可能であることを知っています。(Steve が言及したこの「Hydra」がそうする可能性が非常に高いです。)