14

C++/CLI ラッパー層が必要なネイティブ C++ DLL があります。私が理解したことから、単純に C++/CLI クラスをプロジェクトに追加した場合、VS は混合モードとしてコンパイルされますが、VS はマネージ コードに触れていないように見えるため、明らかに間違っていました。

では、既存のネイティブ コード ベースが与えられた場合、どの .NET 言語からでもそのコードにリンクできるようにするには、混合モード DLL を作成するために正確に何をする必要がありますか?

*私のネイティブ コードは、P/Invoke できない C++ クラスを使用しているため、これを行う必要があります。

4

6 に答える 6

18

いいえ、レガシ DLL がアンマネージ コードで記述されていることを C++/CLI コンパイラに通知するまで、混合モードにはなりません。アンマネージ DLL エクスポートからリンカ エラーが発生しているはずです。#pragma managed を使用する必要があります。

#pragma managed(push, off)
#include "oldskool.h"
#pragma comment(lib, "oldskool.lib")
#pragma managed(pop)

using namespace System;

public ref class Wrapper {
private:
    COldSkool* pUnmanaged;
public:
    Wrapper() { pUnmanaged = new COldSkool; }
    ~Wrapper() { delete pUnmanaged; pUnmanaged = 0; }
    !Wrapper() { delete pUnmanaged; }
    void sampleMethod() { 
        if (!pUnmanaged) throw gcnew ObjectDisposedException("Wrapper");
        pUnmanaged->sampleMethod(); 
    }
};
于 2010-04-22T14:00:46.203 に答える
6

/clr が既存のコードに影響を与えないようにするための適切なオプションは、既存のすべてのコードをネイティブ スタティック ライブラリにコンパイルし、そのスタティック ライブラリを C++/CLI dll のリンク ステップに含めることです。

于 2010-04-24T05:53:57.670 に答える
1

新しいC++/ CLIプロジェクトを開始してから、ネイティブクラスをそのプロジェクトに移動します。

于 2010-04-22T13:50:30.060 に答える
1

プロジェクト レベルで「共通言語ランタイム サポート」を有効にする代わりに、ファイルのプロパティを確認して C/C++ | に移動するだけで、ファイルごとに有効にすることができます。一般 | 共通言語サポート。

これにより、ラッパーだけを含む個別の C++/CLI DLL を作成したり、マネージ/アンマネージ プラグマを多数使用したりするよりも、ネイティブ コードと C++/CLI コードを同じプロジェクトに含めることが容易になる場合があります。

したがって、作成する C++/CLI .NET ラッパー クラスでそれを行うだけです。

于 2012-03-13T12:44:49.867 に答える
0

C++ プロジェクト ファイルには /clr オプションが必要です。これは、一般タブでプロジェクト全体に設定することも、個々のファイルに設定することもできると思います。

clr オプションが指定されると、Visual Studio は C++/CLI を使用してそのクラスをビルドします。

于 2010-04-22T14:58:56.767 に答える
0

ネイティブ C++ を使用した DLL のソース コードがある場合は、マネージ C++ を混合モードで使用できます。Microsoft はしばらく前から、よく知られている DirectX ゲームを .NET に移行するための参照プロジェクトを行っています。1 つは、マネージド C++ を混合モードで使用しました。コードの一部をマネージド コードとして書き直しました。一部は混合モードで C++ としてコンパイルされるようにすぐに変更され、一部はアセンブリ コードとしてコンパイルされましたが (パフォーマンス上の理由から)、アンセーフ コードとしてマネージ コード内でも直接使用されました。この種の移行の結果として、最終アプリケーションで非常に優れたパフォーマンスが得られます。この方法では、ネイティブ コードとマネージ コードの間のマーシャリングに時間を費やす必要がありません。安全なマネージ コードと安全でないマネージ コードの間のマーシャリングは、非常に迅速に行われます。おそらくあなたもこの方法を選択する必要がありますか?

管理された .NET コード内の DLL からネイティブ コードを呼び出す別の方法はよく知られています。すべての C++ 関数には、装飾されていない名前があります ( http://www.dependencywalker.com/を使用して参照してください)。C++ DLL がクラスをエクスポートし、C のような関数をエクスポートしない場合、この DLL は正しく設計されていません。適切に設計された DLL は、C に似た関数をエクスポートするか、COM インターフェイスをエクスポートします。そのような「悪い」DLL があり、COM の作成に時間を費やしたくない場合は、スタブの役割を果たすもう 1 つの DLL を簡単に作成できます。この DLL はすべての C ++クラスをインポートします。 howto_export_cpp_classes.aspxなど) 「悪い」DLL からエクスポートし、C のような関数をエクスポートします。この方法でもOKです。

于 2010-04-22T14:15:57.507 に答える