0

以下のような ac# ファイルがあります。

//MyHandler.cs
public **class MyHandler**
{
**Function1(IntPtr handle)**
{....}
Function2(MyImageHandler myImgHandler,int height,int width)
{....}
};

public **class MyImageHandler**
{
FunctionX(string imagePath,int height,int width)
{.....}
};

次のように、ヘッダー ファイルを含む c++/CLI ラッパー dll を使用してラップしています。

//IWrapper
#pragma once
#include<windows.h>
#include <string>

#ifdef MANAGEDWRAPPER_EXPORTS
#define DLLAPI  __declspec(dllexport)
#else
#define DLLAPI  __declspec(dllimport)
#pragma comment(lib,"D:\\MY\\MYY1\\Wrapper\\Debug\\MyFinalLibrary.lib")
#endif

class IWrapper
{
public:
   virtual DLLAPI void Function1(HWND  handle)=0;
   **virtual __stdcall void Function2(MyImageHandler myImageHandler,int width,int height)=0;**
};

** MyImageHandler はマネージド クラスなので、__stdcall を介してエクスポートしています。これを行うのは正しいですか? ** これで、上記のヘッダー ファイルを実装するヘッダー ファイルと、次のような cpp ファイルがあります::

#include "Wrapper.h"
#include "IWrapper.h"
#include<vcclr.h>
#include <windows.h>
Function1(HWND handle)
{....}
Function2(MyImageHandler myImgHandler,int height,int weight)
{
//Here I need to typecast the MyImageHandler type to a managed handle
}
4

1 に答える 1

0

これを Visual Studio 2005 でテストしたところ、次のように動作しました。

//Project: InteropTestCsLib, class1.cs
namespace InteropTestCsLib
{
    public class Class1
    {
        public int Add(int a, int b) { return a+b; }
    }
}

C# プロジェクトへのアセンブリ参照を含む C++/CLI プロジェクトで、プロジェクト リンク オプションの [インポート ライブラリを無視] が無効になっている (デフォルトで有効になっている)

//Project: InteropTestCppCliLib, InteropTestCppCliLib.h
namespace InteropTestCppCliLib {

    public ref class MyWrapper abstract sealed
    {
    public:
        static int Add(int a, int b);
    };
}
//Project: InteropTestCppCliLib, InteropTestCppCliLib.cpp
namespace InteropTestCppCliLib {

int MyWrapper::Add(int a, int b)
{
    InteropTestCsLib::Class1^ obj = gcnew InteropTestCsLib::Class1();
    return obj->Add(a, b);
}

}

//Free function, neither in a namespace nor class, but still managed code
extern "C" int __stdcall MyWrapperAdd(int a, int b)
{
    return InteropTestCppCliLib::MyWrapper::Add(a, b);
}

モジュール定義ファイル (.def):

LIBRARY "InteropTestCppCliLib"
EXPORTS
    MyWrapperAdd

最後に、空のネイティブ Win32 C/C++ プロジェクトで、プロジェクトは C++/CLI DLL に依存しています (または単に、生成されたインポート ライブラリをインポートするプロジェクト):

/*Project: InteropTestUnmanagedApp, main.c*/
#include <stdio.h>

__declspec(dllimport) int __stdcall MyWrapperAdd(int a, int b);

int main(void)
{
    int x = 10;
    int y = 32;
    int result = MyWrapperAdd(x, y);
    printf("%d + %d = %d\n", x, y, result);
    return 0;
}

C プロジェクトは C++/CLI をシームレスに呼び出しました。

于 2013-05-22T12:53:48.087 に答える