1

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': 抽象クラスをインスタンス化できません

これらのエラーを修正するにはどうすればよいですか?解決策を教えてください。

4

3 に答える 3

0

これは、C++ からマネージコードを呼び出すための簡単なチュートリアルです。私はこれを以前に使用したことがあり、私にとってはうまくいきました。それがあなたの要件を満たすことを願っています.

于 2013-05-15T18:32:21.477 に答える
0

解決策 1

This SO answerは、CLIを使用してC++からC#クラスを呼び出す方法を説明しています(この例は、いくつかの管理対象オブジェクトの配列を渡す方法を示しています):

public ref class CSharpClassName
{
     //code
}

C++ 相互運用性: ネイティブ C++ から C# クラスを呼び出すにはどうすればよいですか?

このウェブサイトも非常に役立ちます:

http://www.functionx.com/cppcli/examples/array1.htm

またはこれ(例付き):

http://1code.codeplex.com/wikipage?title=Invoke%20.NET%20Assembly%20from%20Native%20C%2b%2b#CLIWrapper

解決策 2

ホスト CLR

http://1code.codeplex.com/wikipage?title=Invoke%20.NET%20Assembly%20from%20Native%20C%2b%2b#HostCLR

解決策 3

.NET アセンブリを COM サーバーに変換し、.NET-COM 相互運用を通じて C++ から呼び出します http://1code.codeplex.com/wikipage?title=Invoke%20.NET%20Assembly%20from%20Native%20C%2b% 2b#COM相互運用

于 2013-05-15T11:31:20.350 に答える
0

C# dll を参照として c++/cli プロジェクトに追加し、次に例を示します。

DicomHandler^ foo = gcnew DicomHandler();
foo->TestImage(..);

私はあなたがすでに持っていると仮定します

using namespace MyImage;
于 2013-05-15T21:06:04.393 に答える