トップ回答者
C++/CLI共有プロパティの「Frameと参照」にC# DLLが追加できない

質問
-
環境:Windows 10 Pro + VS2010 Pro + .NET Framework V4.0
問題概要:
MFCのダイアログからC#のファイル圧縮機能(ZipFile.CreateFromDirectoryメッソド)を使用するためMFC<->C++/CLI(クラスライブラリ)<->C# DLLリンクをテストしています。
この内、C++/CLIのソリューションの共有プロパティ「Frameと参照」にC# DLLが追加しようとして次のエラーは発生しました。「.NETアセンブリまたは登録されたActiveXコントロールではないため、ファイル".....TestCS.dlll"に参照を追加できませんでした。」 備考:TestCS.DllはC# DLLです。
この状態でC++/CLIをビルドすると「error C2653: 'TestCS' : 識別子がクラス名でも名前空間名でもありません。」のエラーになります(当然とおもいますが、、、)。
主な設定:
- 全てのプロジェクトは同じソリューション内で作成しています。
- #C DLLのプロパティで「COM互換運用機能の登録」は選択していません。
- C++/CLIの構成プロパティの共有言語ランタイムサポートで「/clr」を選択しています。
- すべてのビルド/リンク先をソリューションフォルダーの「release」に指定しています。
- MFCのリンカーの入力の「追加の依存ファイル」でC++/CLIのLIBを追加指定しています。
- ソリューションのC# DLLの「参照設定」に.NET Frameworkのフォルダーから「System.IO.Compression.FileSystem」と「,,,Compression.ZipFile」を追加しています。
試した事:
試行錯誤した結果次の順序で設定とビルドを行うと取り敢えずMFCが実行し圧縮ファイルが作成できます。
1.C#DLL内の「ZipFile.CreateFromDirectory...」をコメントにすると共有プロパティ「Frameと参照」にC# DLLが追加できます。
2.その後C++/CLIをリンクすると正常にC++/CLIのLIBが作成されす。
3.C#DLL内の「ZipFile.CreateFromDirectory...」のコメントを外し再度ビルドしDLLを作成します。
4.MFCをビルドしで実行すると意図した通り実行します。質問:
1.C++/CLIのソリューションの共有プロパティ「Frameと参照」にC# DLLが追加しようとしてなぜエラーが発生するのでしょうか。
2.上記の「試した事」の方法で実行モジュールを作成して通常に運用した場合でも問題が無い(問題が発生しない)のでしょうか。このサイトで同じようなエラーのQ/Aで次のような部分を発見しました。
-----------------------------------------------------------------
C++からC#を含む.NET DLLを呼び出す方法は次の2種類です。
•C++側もC++/CLIとしてマネージコードにする
•.NET DLLをCOM登録して、C++側からはCOM呼び出しをする
----------------------------------------------------------------つぶやき:
「C# DLLが.NETのアセンブリではないためのエラー」と思うが
C++/CLI中間コードはマネージコードで問題はないと思うし、、、、
ZipFile.CreateFromDirectoryは.NET Frameworkのメッソドだし、、、
あるサイトに「参照に追加するのではなく、そのDLLをプログラムが参照できる場合、たとえば実行ファイルと同じフォルダに配置すると解決する」とあるが、実際に全てのビルド結果はソリューションの「release」フォルダーに置いているし、、、C++/CLI + C#の環境での開発は初めてです。
内容が長くなりましたが、アドバイス頂きたく宜しくお願い致します。
回答
-
まず、System.IO.Compression.dllおよびSystem.IO.Compression.FileSystem.dllは、.NET Framework 4.5で追加されたアセンブリです(System.IO.Compression.ZipFile.dllというアセンブリは、.NET Framework 4.7までの標準ライブラリには存在しないはずです)。ターゲットが.NET Framework 4(.NET Framework 4.0というのは存在しない)では使用できません。そしてVisual Studio 2010は.NET Framework 4までしか開発ターゲットにできなかったはずなので、Visual Studio 2010を使う限り、System.IO.Comprssion.dll等を参照設定することはできないはずです。お使いのVisual Studioのバージョンおよび各プロジェクトのターゲットとしている.NET Frameworkのバージョンをご確認ください。
次に、System.IO.Compression等は、「C#のファイル圧縮機能」ではありません。「.NET Frameworkの」機能です。なので、.NET Frameworkを扱える言語であればどれでも、つまりC++/CLIでも使用できます。なので一々C#を使用する必要はありません。C++/CLIプロジェクトの対象としている.NET Frameworkのバージョンさえ適切であれば、System.IO.Compression.dll等を参照し呼び出すことができます。
-
確かにMSDNではSystem.IO.Compression名前空間は.Net Framework4.5以降で使用可能とありました。 私のWindows 10の方は.NET Framework 4.6.1まで導入しているためSystem.IO.Compressはシステムのディレクトリに存在するためそれを使用してしまいました。
補足します。C:\Windows\Microsoft.NET に置かれているファイルはアプリケーション実行用です。またここのファイルはWindows Updateで順次更新されるため例えばFall Creators Updateを適用していれば4.7.1になっています。
「.NET Framework 4.6.1まで導入している」とのことですが、こちらは開発時に参照するためのアセンブリであり C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework に置かれています。Visual Studio 2010はC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0ディレクトリを参照するため「System.IO.Compression.dllが存在しない」という動作になります。
- 回答としてマーク HIRA_TKA 2018年3月4日 11:42
-
Visual Studio 2010でv4.5.1を参照させる方法はあるのでしょうか (Webを検索してもダメと言うのは見つけましたが、、、)。
無いというのが先のHongliangさんの回答です。.NET Framework Developer Pack または Targeting Pack をインストールするにはで説明されているDeveloper PackやTargeting Packがそれですが、例えば.NET Framework 4.5.1 Developer Packの説明にも
開発者は、Visual Studio 2012 またはサードパーティの IDE を使用して、.NET Framework 4.5.1 を対象としたアプリケーションを開発できます。
となっていてVisual Studio 2010以前については言及されていません。ですのでダメかと…。
- 回答としてマーク HIRA_TKA 2018年3月4日 11:42
すべての返信
-
まず、System.IO.Compression.dllおよびSystem.IO.Compression.FileSystem.dllは、.NET Framework 4.5で追加されたアセンブリです(System.IO.Compression.ZipFile.dllというアセンブリは、.NET Framework 4.7までの標準ライブラリには存在しないはずです)。ターゲットが.NET Framework 4(.NET Framework 4.0というのは存在しない)では使用できません。そしてVisual Studio 2010は.NET Framework 4までしか開発ターゲットにできなかったはずなので、Visual Studio 2010を使う限り、System.IO.Comprssion.dll等を参照設定することはできないはずです。お使いのVisual Studioのバージョンおよび各プロジェクトのターゲットとしている.NET Frameworkのバージョンをご確認ください。
次に、System.IO.Compression等は、「C#のファイル圧縮機能」ではありません。「.NET Frameworkの」機能です。なので、.NET Frameworkを扱える言語であればどれでも、つまりC++/CLIでも使用できます。なので一々C#を使用する必要はありません。C++/CLIプロジェクトの対象としている.NET Frameworkのバージョンさえ適切であれば、System.IO.Compression.dll等を参照し呼び出すことができます。
-
Hongliang 様
早速のアドバイスありがとうございます。
まず、System.IO.Compression.dllおよびSystem.IO.Compression.FileSystem.dllは、.NET Framework 4.5で追加されたアセンブリです(System.IO.Compression.ZipFile.dllというアセンブリは、.NET Framework 4.7までの標準ライブラリには存在しないはずです)。
確かにMSDNではSystem.IO.Compression名前空間は.Net Framework4.5以降で使用可能とありました。 私のWindows 10の方は.NET Framework 4.6.1まで導入しているためSystem.IO.Compressはシステムのディレクトリに存在するためそれを使用してしまいました。
ターゲットが.NET Framework 4(.NET Framework 4.0というのは存在しない)では使用できません。
C++/CLIの共有プロパティの「Frameworkと参照」で「対象のフレームワーク:.NETFramework, Version=4.0」と言う表記があったため「... 4.0」としました。
そしてVisual Studio 2010は.NET Framework 4までしか開発ターゲットにできなかったはずなので、Visual Studio 2010を使う限り、System.IO.Comprssion.dll等を参照設定することはできないはずです。お使いのVisual Studioのバージョンおよび各プロジェクトのターゲットとしている.NET Frameworkのバージョンをご確認ください。
ベースのMFCプログラムがVisual Studio 2010で既に開発されていて実績があったためVisual Studio 2010にこだわっていました。 Visual Studio 2015でテストした結果確かに問題なく参照設定ができました。
水平方向の連携のみを気にしていましが、垂直方向(バージョン)まで頭に浮かびませんでした。次に、System.IO.Compression等は、「C#のファイル圧縮機能」ではありません。「.NET Frameworkの」機能です。なので、.NET Frameworkを扱える言語であればどれでも、つまりC++/CLIでも使用できます。
言われてみればその通りですね。
なので一々C#を使用する必要はありません。C++/CLIプロジェクトの対象としている.NET Frameworkのバージョンさえ適切であれば、System.IO.Compression.dll等を参照し呼び出すことができます。
C++/CLIに「ZipFile::CreateFromDirectory...」を組み込みファイルの圧縮ができました。 C# DLLは必要ないのですね(なるほど~)。
今回はMFC<-->C++/CLI<-->C# DLL間の文字列の受け渡し受け取り、DLLのリンク、.NET FrameworkバージョンとSystem.IO.Compression等大変勉強になりました。
貴重なアドバイスを頂き重ねてお礼申し上げます。 ありがとうございました。
-
確かにMSDNではSystem.IO.Compression名前空間は.Net Framework4.5以降で使用可能とありました。 私のWindows 10の方は.NET Framework 4.6.1まで導入しているためSystem.IO.Compressはシステムのディレクトリに存在するためそれを使用してしまいました。
補足します。C:\Windows\Microsoft.NET に置かれているファイルはアプリケーション実行用です。またここのファイルはWindows Updateで順次更新されるため例えばFall Creators Updateを適用していれば4.7.1になっています。
「.NET Framework 4.6.1まで導入している」とのことですが、こちらは開発時に参照するためのアセンブリであり C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework に置かれています。Visual Studio 2010はC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0ディレクトリを参照するため「System.IO.Compression.dllが存在しない」という動作になります。
- 回答としてマーク HIRA_TKA 2018年3月4日 11:42
-
佐祐理 様
お世話になっています。
Visual Studio 2010はC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0を参照するのですね。
Visual Studio 2010でv4.5.1を参照させる方法はあるのでしょうか (Webを検索してもダメと言うのは見つけましたが、、、)。
因みに、Visual Studio 2010でC++/CLIから「ZipFile::CreateFromDirectory...」をコールする方法で「Frameworkと参照」に「System.IO.Compression.FileSystem」と「,,,Compression.ZipFile」を追加しても前のスレッド通りのエラーになりました。
更に、佐祐理様の説明にヒントを得て「構成プロパティ」の「C/C++のコマンドライン」に「/FU"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.dll" /FU"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"」を追加したところC++/CLIのビルドが正常に終了してファイルの圧縮ができました(イレギュラーな処理???)。
Visual Studio 2010でのテストはこの位でVisual Studio 2015を使いたいと思います。
色々情報ありがとうございました。
-
Visual Studio 2010でv4.5.1を参照させる方法はあるのでしょうか (Webを検索してもダメと言うのは見つけましたが、、、)。
無いというのが先のHongliangさんの回答です。.NET Framework Developer Pack または Targeting Pack をインストールするにはで説明されているDeveloper PackやTargeting Packがそれですが、例えば.NET Framework 4.5.1 Developer Packの説明にも
開発者は、Visual Studio 2012 またはサードパーティの IDE を使用して、.NET Framework 4.5.1 を対象としたアプリケーションを開発できます。
となっていてVisual Studio 2010以前については言及されていません。ですのでダメかと…。
- 回答としてマーク HIRA_TKA 2018年3月4日 11:42