0

C++/CLI .dll プロジェクトでネイティブ .dll プロジェクトの C++ クラスを使用しようとしています。Visual Studio 2010、.NET Framework 3.5。これまでのところ、これは私が持っているものです:

// This is a common macro:
#ifdef ISDLL
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

NativeProject:
   //INativeType.h: 
   class DLL INativeType {
       public:
           virtual void Foo() = 0;
   };

    //NativeType.h: 
    class DLL NativeType : public INativeType {
        public:
            virtual void Foo(); 
    };

    extern "C" DLL INativeType CreateNativeType();

    //NativeType.cpp: 
    void NativeType::Foo() {} 
    extern "C" DLL INativeType* CreateNativeType() { 
        return new NativeType(); 
    }

C++/CLI Project:
    // Wrapper.h:
    #include "INativeType.h"
    ref class Wrapper {
        INativeType* m_nativeType;
    };

    // Wrapper.cpp:
    #include "Wrapper.h"
    #include "NativeType.h"
    // in some method:
        m_nativeType = CreateNativeType();

これにより、次のリンカ エラーが発生します。

error LNK2028: unresolved token (...) "extern "C" class INativeType * __stdcall CreateNativeType(void)"" ... in Wrapper.obj

また、関数は NativeProject.dll に正しくエクスポートされていますが、DependencyWalker で確認したところ、リンカーは次の警告も表示します。

warning LNK4199: /DELAYLOAD:NativeProject.dll ignored; no imports found from NativeProject.dll

C++/CLI プロジェクトは、NativeProject.dll の読み込みを遅らせるように構成されており、リンカー オプションに NativeProject.lib も含まれています。現時点では、このリンカ エラーを診断する方法がわかりません。私は何を間違っていますか?

4

1 に答える 1

1

ファクトリ メソッドを使用する代わりに、C++/CLI プロジェクトにクラスを直接インスタンス化させてみませんか?

それに加えて、COM を再発明しているように見えます (インターフェイスを介してオブジェクトを使用)。本格的な C++ クラスをインスタンス化するか、本当に必要な場合は本格的な COM を使用します。

編集:ファクトリ メソッドの呼び出し規約がクライアントと DLL の両方で同じであることを確認してください。

于 2013-01-28T21:10:00.920 に答える