-1

以下はC#での私のコードです...

ここでコールバックは C# のみで実装されすぎています。C++ dll からのコールバックが必要です

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


class Program
{
  //   [DllImport("C:/Users/kool/Documents/Visual Studio 2010/Projects/DLL/Debug/DLL.dll", CallingConvention = CallingConvention.Cdecl)]


    static void Main(string[] args)
    {


        function1(function2);   // i want thia function2 to be fetched from ++ dll

    }

    public delegate void fPointer(); // point to every functions that it has void as return value and with no input parameter 
    public static void function1(fPointer ftr)
    {
        fPointer point = new fPointer(ftr);
        point();
    }
    public static void function2()
    {
        Console.WriteLine("Bla");
    }
}

function2 を送信する場所から dLL を作成します

function1(function2); 

どうすれば実装できますか??

4

2 に答える 2

0

1 つの方法は、C# アセンブリをタイプ ライブラリとしてエクスポートし、それを C++ から COM コンポーネントのように使用することです。

Visual Studio コマンド プロンプトで TlbExp.exe を使用して、C# アセンブリをタイプ ライブラリとしてエクスポートします。次に、タイプ ライブラリを RegAsm.exe に登録します。次に、C++ コードで #import ディレクティブを使用してタイプ ライブラリをインポートします。C++ の C# クラスを COM クラスのように使用できるようになりました。

詳細については、http: //msdn.microsoft.com/en-us/library/ms172270.aspxを参照してください。

編集: 申し訳ありませんが、C# から C++ を使用するか、C++ から C# を使用しますか?

どちらでも可能です。上記のリンクは、C++ から C# を使用する方法を説明しています。これは、C# から C++ を使用する方法を説明しています: http://msdn.microsoft.com/en-us/library/z6tx9dw3.aspx

于 2012-09-18T11:33:43.987 に答える
0

マネージ .net 関数にポインターを送信し、マネージされていないコード (コールバック) から呼び出すことができます。

詳細はこちらhttp://habrahabr.ru/post/130690/ (必要に応じて Google を使用してロシア語から翻訳しますが、最後の 2 つのコード例を確認する必要があります)。

コードの呼び出しも確認してください。マネージド側とアンマネージド側の両方に準拠する必要があります ( C コードで__ stdcallを使用し、 DllImport属性でCallingConvention = CallingConvention.Cdeclを使用します)。

于 2012-09-18T12:09:00.903 に答える