14

Delphi .exe によって呼び出される単一のメソッドで .Net 3.5 dll を作成しました。残念ながら、うまくいきません。

手順: 1. 次のコードで C# 3.5 dll を作成します。

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 を使用できるようにするために必要な手順は何ですか。

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

ありがとうございました

4

3 に答える 3

38

管理されていないエクスポートに私のプロジェクトテンプレートを使用すると、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として期待します)

于 2011-05-30T10:48:07.523 に答える
9

大規模な調査の後、私は解決策を見つけました。それはすべて登録パラメーターに関するものです。フラグ /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 を使用して登録しました

于 2011-06-22T07:42:40.860 に答える
2

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

于 2011-05-30T10:08:59.700 に答える