0

現在、私が働いている会社は、すべてのソフトウェアに新しいグラフィカル ユーザー インターフェイスを実装しています。新しい GUI は、.NET Framework と相互運用するために多くの古いソフトウェアを必要とする WPF で実装されます。私は最近、ネイティブ C++ で記述されたソフトウェア用の WPF インターフェイスを実装する任務を割り当てられました。

ネイティブ C++ コードをラップする C++/CLI 内にラッパーを実装することにしました。ラッパーによって取得された機能は、C# 内で使用されます。

私が抱えている問題は、C++/CLI プロジェクトからヘッダー ファイル (ネイティブ C++ プロジェクト内にある) を参照するたびに、多くのエラーが発生することです (以下を参照)。プロジェクトがスタンドアロンでビルドされている場合、ネイティブ コードはエラーなしでコンパイルされるため、これは問題です。

2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(16): error C2061: syntax error : identifier 'DWORD'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(17): error C2061: syntax error : identifier 'CAtlString'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(17): error C2535: 'CFExeption::CFExeption(void)' : member function already defined or declared
2>          C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(16) : see declaration of 'CFExeption::CFExeption'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(18): error C2146: syntax error : missing ';' before identifier 'GetErrorText'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(18): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

等...

  1. ネイティブ C++ は C++/CLI と完全に互換性がありますか? またはネイティブ C++ コードに変更を加える必要がありますか?
  2. このタスクへのより適切なアプローチはありますか?
  3. エラー メッセージの解決策やアドバイスがあれば、お気軽にコメントしてください。
4

1 に答える 1

1

定義されていないと文句を言ってDWORDいる場合は、Windows ヘッダーが見つからない可能性があります。#include <windows.h>ライブラリのヘッダーを含める前に追加してみてください。(または FileOperation.h を変更して、windows.h 自体を含めます。)

「ネイティブ C++ は C++/CLI と完全に互換性がありますか?」に対する回答として、答えは「ほぼ」です。問題が発生するのは、C++/CLI の言語キーワードである何かが C++ で定義されている場合です。たとえば、は C++ では完全に有効ですが、 はキーワードであるint gcnew = 1ため、C++/CLI ではまったく機能しません。gcnewただし、一般的には問題ありません。

あなたの質問から、すべての C++ コードを取得して、C++/CLI プロジェクトにコンパイルしているように思えます。これが既存のテスト済みライブラリである場合、別のオプションは、C++ コードをアンマネージ DLL として保持し、C++/CLI からアンマネージ DLL を呼び出すことです。同じプロジェクトに一緒に押し込むのではありません。そうは言っても、私の好みは、C++ コードをマネージ アセンブリにコンパイルするという、あなたが行っているように見えることです。

于 2013-02-20T16:36:37.843 に答える