2

私は次の手順を実行しようとしています: C++ からの C# の呼び出し、リバース P/Invoke、混合モード DLL、および C++/CLI 1. TestLib という名前の C# DLL を作成します。

namespace TestLib
{
    public class TestClass
    {
        public float Add(float a, float b)
        {
            return a + b;
        }
    }
}

2. 次に、WrapperLib という名前の C++/CLI Dll を作成し、C# TestLib への参照を追加します。

// WrapperLib.h

#pragma once

using namespace System;
using namespace TestLib;

namespace WrapperLib {

    public class WrapperClass
    {
    float Add(float a, float b)
        {
        TestClass^ pInstance = gcnew TestClass();
        //pInstance
        // TODO: Add your methods for this class here.
        return pInstance->Add(a, b);
        }
    };
}

C+ 3. この例を確認するために、C++/CLI コンソール アプリケーションを作成し、次のコードを呼び出してみました。

// ConsoleTest.cpp : main project file.

#include "stdafx.h"

using namespace System;
using namespace WrapperLib;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
    WrapperClass cl1 = new WrapperClass();

    return 0;
}

しかし、いくつかのエラーが発生します。

error C2065: 'WrapperClass' : undeclared identifier C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp    11  1   ConsoleTest
error C2146: syntax error : missing ';' before identifier 'cl1' C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp    11  1   ConsoleTest
error C2065: 'cl1' : undeclared identifier  C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp    11  1   ConsoleTest
error C2061: syntax error : identifier 'WrapperClass'   C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp    11  1   ConsoleTest

見逃した場所は知っていますが、どこですか?

4

2 に答える 2

2

@Ben Voigt の提案によると、コードは次のようになるはずです。

// ConsoleTest.cpp : main project file.

#include "stdafx.h"
#include "WrapperLib.h"

using namespace System;
using namespace WrapperLib;

int main(array<System::String ^> ^args)
{
    float result;
    Console::WriteLine(L"Hello World");
    WrapperClass cl1;

    result = cl1.Add(1, 1);

    return 0;
}

ラッパー ライブラリのヘッダー ファイルをインクルードしない場合、C++ コンパイラはその関数を見つけることができず、以前に表示したエラーが発生し続けます。

于 2012-06-20T14:12:03.023 に答える
1

それは良い C++ ではありません。Java や C# のように見えます。

C++/CLI で新しいオブジェクトを作成する正しい構文は次のとおりです。

WrapperClass cl1;

また

WrapperClass^ cl1 = gcnew WrapperClass();

C++ にはスタック セマンティクスがあります。関数の最後に自動的に破棄されるローカル オブジェクトが必要なのか (最初のオプション)、それともより長く存続できるハンドルが必要なのか (2​​ 番目のオプション、 and を使用) をコンパイラに伝える必要があり^ますgcnew

于 2012-06-20T13:39:48.577 に答える