web-dev-qa-db-ja.com

DelphiからC#dllを呼び出す

Delphi.exeによって呼び出される単一のメソッドで.Net3.5dllを作成しました。残念ながら、それは機能しません。

手順:1。コードを使用してC#3.5dllを作成します。

public class MyDllClass
{
    public static int MyDllMethod(int i)
    {
        MessageBox.Show("The number is " + i.ToString());
    }
}
  1. [アセンブリのプロパティ]-> [アセンブリ情報]に移動し、[アセンブリをCOM表示にする]をオンにします
  2. RegAsm.exeを使用してdllを登録しました

これにより、dllに接続できないことを示すDelphi例外がスローされます。アンマネージコードからC#マネージDLLの使用を有効にするために必要な手順は何ですか。

主題についての良い例に精通している人はいますか?

ありがとうございました

14

大規模な調査の結果、解決策が見つかりました。それはすべて登録パラメータに関するものです。フラグ/ codebaseをregasmコマンドに追加する必要があります。

そこにある多くの投稿は、C#Com公開オブジェクトでGuidおよびその他のCOM属性を使用することを提案しています。私は、ComVisible(true)属性とregasm/tlb/codebseコマンドを使用してCOM機能を提供することができました。

コード:

[Guid("7DEE7A79-C1C6-41E0-9989-582D97E0D9F2")]
[ComVisible(true)]
public class ServicesTester
{
    public ServicesTester()
    {
    }

    //[ComVisible(true)]
    public void TestMethod()
    {
        MessageBox.Show("You are in TestMEthod Function");
    }
}

そして、私が言ったように、私はそれを登録するためにregasm.exe/tlb/codebaseを使用しました

8

私の 管理されていないエクスポート用のプロジェクトテンプレート を使用すると、COM部分をスキップすることができます

class MyDllClass
{
    [DllExport]
    static int MyDllMethod(int i)
    {
        MessageBox.Show("The number is " + i.ToString());
        return i + 2;
    }
}

Delphiでは、次のようにインポートします。

function MyDllMethod(i : Integer) : Integer; stdcall; extern 'YourAssembly.dll';

しかし、私はあなたの質問に反対票を投じなければなりませんでした。コンパイルするコードを提供するほど気にしないため。 (C#メソッドは値を返しませんが、intとして期待します)

34
Robert Giesecke

Assembly x64またはAnyCPUを作成した場合に、問題になる可能性があることが1つあります。 Delphiは32ビット(x86)であるため、アセンブリをx86にするか、regasm.exeが32ビットレジストリにも登録していることを確認する必要があります。これを行うには、x86バージョンのregasm.exeを使用します。

2
Lars Truijens