C#
からクラスを呼び出したいC++CLR
。同じラッパーも作成しました。C#
クラス ライブラリで次のように仮定します。
namespace MyImage
{
public class DicomHandler
{
public void TestImage(DicomImage dicomImage,int height,int width)
{
}
}
public class DicomImage
{
}
}
次に、 でWrapper
のオブジェクトを作成したDicomHandler
ので、 を呼び出す必要がありますTestImage(DicomImage dicomImage,int height,int width)
。
ラッパー クラス ライブラリには、
IWrapper.h 内
#pragma once
#include<windows.h>
#include <string>
using namespace MyImage;
#ifdef MANAGEDWRAPPER_EXPORTS
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#pragma comment(lib,"F:\\8May\\firebreath-FireBreath-firebreath-1.7.0-0- gdf8659e\\firebreath\\Wrapper\\Debug\\Wrapper.lib")
#endif
class IWrapper
{
public:
static IWrapper *CreateInstance();
static void Destroy(IWrapper *instance);
virtual DLLAPI void Sethandle(HWND handle)=0;
virtual DLLAPI void TestDicomImage(DicomImage^ _dicomImage,int width,int height)=0;
};
In Wrapper.h,
#pragma once
#include <windows.h>
#include <vcclr.h>
#include "IWrapper.h"
#include "stdio.h"
#include "string.h"
using namespace System;
using namespace System::Reflection;
using namespace System::IO;
using namespace MyImage;
using namespace std;
using namespace System::Runtime::InteropServices;
class Wrapper:public IWrapper
{
private:
gcroot<DicomHandler^> _dicomHandler;
//gcroot<DicomImageHandler^> _dicomImageHandler;
public:
Wrapper(){}
virtual DLLAPI void SetHandle(HWND handle);
virtual DLLAPI void TestDicomImage(DicomImage^ _dicomImage,int winwidth,int winheight);
};
Wrapper.cpp では、
#include "stdafx.h"
#include "Wrapper.h"
#include "IWrapper.h"
#include <windows.h>
#include<iostream>
#include <winuser.h>
#include <tchar.h>
#include<vcclr.h>
#include <msclr\marshal_cppstd.h>
#include <string>
using namespace System::Reflection;
using namespace System::Runtime::InteropServices;
using namespace System;
using namespace System::IO;
using namespace std;
using namespace DicomImage;
void Wrapper::SetHandle(HWND handle)
{
_dicomHandler=gcnew DicomHandler;
//_dicomImageHandler=gcnew DicomImageHandler;
_dicomHandler->SetHandle((System::IntPtr)handle);
}
IWrapper *IWrapper::CreateInstance()
{
IWrapper *instance =(IWrapper*)new Wrapper();
return (instance);
}
void IWrapper::Destroy(IWrapper *instance)
{
delete instance;
}
void Wrapper::TestDicomImage(DicomImage^ _dicomImage,int width,int height)
{
_dicomHandler->TestImage(_dicomImage,width,height);
}
次に、次のような3つのエラーが発生します
1) エラー C3395: 'Wrapper::TestDicomImage': __declspec(dllexport) は、__clrcall 呼び出し規約を持つ関数に適用できません
2) エラー C3395: 'IWrapper::TestDicomImage': __declspec(dllexport) は、__clrcall 呼び出し規約を持つ関数に適用できません
3) エラー C2259: 'Wrapper': 抽象クラスをインスタンス化できません
これらのエラーを修正するにはどうすればよいですか?解決策を教えてください。