2017-06-26 35 views
1

私はC#プログラマーで、C++/CLIラッパーを作成しようとしています。私はちょうどテストをやっているC++ DLL VS2015 - C++ DLLとのCRLのリンク

  • C++ CLR
  • WPF C#の
    • ので、私はこれらの実装だ:私は、ソリューション内の3つのプロジェクトを持っている

      C++ DLL Testing.h:


      C++ DLL Testing.cpp

      #include "Testing.h" 
      
      int Test::Increment() 
      { 
          return counter++; 
      } 
      

      CLR Wrapper.h

      #pragma once 
      #include "Testing.h" 
      
      using namespace System; 
      
      namespace Wrapper 
      { 
          public ref class Wraptest 
          { 
          public: 
           Wraptest(); 
           int Increment(); 
      
          private: 
           Test* t; 
          }; 
      } 
      

      CLR Wrapper.cpp

      #include "stdafx.h" 
      #include "Wrapper.h" 
      #include "PITest.h" 
      
      Wrapper::Wraptest::Wraptest() 
      { 
          t = new Test(); 
      } 
      
      int Wrapper::Wraptest::Increment() 
      { 
          return t->Increment(); 
      } 
      

      WrapperプロジェクトのTesting C++ DLLプロジェクトへの参照を追加しました。また、WrapperのAdditional IncludesにDLLソリューションヘッダーファイルを追加しました。

      C++ DLLプロジェクトがうまく構築し、私はラッパーのプロジェクトをビルドするとき、私はこれらのエラーを取得:

      重大度コード説明プロジェクトファイルの行の抑制状態 エラーLNK2028未解決のトークン(0A000007)「公共:__thiscallテスト"public:__clrcall Wrapper :: Wraptest :: Wraptest(void)"(0Wraptest @ Wrapper @@ $$ FQ $ AAM)で参照されている ":: Test(void)"(?? 0Test @@ $$ FQAE @ XZ) @XZ)ラッパーC:\ Users \ mytoy \ Documents \ Visual Studio 2015 \ Projects \ CodeTest \ Wrapper \ Wrapper.obj 1

      重大度コード説明プロジェクトファイルの行の抑制状態 エラーLNK2019未解決の外部シンボル "public:__cliscall Wrapper :: Wraptest :: Wraptest(void)"で参照される "public:__thiscall Test :: Test(void)"(?? 0Test @@ $ FQAE @ XZ) ?0Wraptest @ Wrapper @@ $$ FQ $ AAM @ XZ)ラッパーC:¥Users¥mytoy¥Documents¥Visual Studio 2015¥Projects¥CodeTest¥Wrapper¥Wrapper.obj 1

      重大度コード説明プロジェクトファイルの行抑止状態 エラーLNK1120 2つの未解決の外部ラッパーC:プロジェクト\ CodeTest \デバッグ\ Wrapper.dll \ Visual Studioの2015 \ \ Users \ユーザーmytoy \文献1


      私は解決策を把握することはできません。おかげさまで

    +0

    _Wrapper_プロジェクトのプロジェクトプロパティのLinker ** Imports **セクションに** Testing.lib **を追加する必要はありませんか? – MickyD

    +0

    問題は、呼び出し規則が誤って一致しているように見えます。この[リンク](https://docs.microsoft.com/en-us/dotnet/framework/interop/marshaling-data-with-platform-invoke)からプラットフォームの呼び出しでデータをマーシャリングする手がかりを得るかもしれません。 –

    +0

    これは単純なリンカーエラーですが、Test :: Increment()について不平を言っていないことは間違いです。クラスがネイティブDLLからエクスポートされていることを確認するために行ったことはまったく明らかではありません。不完全な.defファイルだけが合理的な推測です。 Increment()だけでなく、クラス全体を確実にエクスポートするには、クラス宣言でdllexport/dllimport属性のダンスを行う必要があります。 DLLの代わりに静的ライブラリとしてネイティブコードをビルドするのも簡単です。 –

    答えて

    0

    さて、私はそれを動作させることができました。それは簡単です。

    私はthis linkをチェックし、私は、この欠落していた:私はちょうど追加含まディレクトリ(リンカ変わらず)にヘッダの場所を追加し、私は箱から出して動作しますラッパーで

    // C++ DLL Header 
    #ifdef TESTING_EXPORTS 
        #define TESTING_API __declspec(dllexport) 
    #else 
        #define TESTING_API __declspec(dllimport) 
    #endif 
    

    を。

    関連する問題