当社の製品はC++プロジェクトの束に基づいていますが、現在はフロントエンドにC#プロジェクトを使用しています。私たちは現在64ビット版もやっています。
すべてのC#dllをAnyCPUとして構築することを計画しています。 C#プロジェクトは、共通のbinフォルダ内のC++ dllへの参照を持ちます。 x64をビルドすると、binフォルダーにはx64バージョンのC++ DLLが含まれ、Win32をビルドするとbinフォルダーには32ビットバージョンのC++ dllが含まれます。したがって、C#プロジェクトはAnyCPUを構築しますが、x64またはWin32のいずれかのC++ dllを含みます。
私の質問は、これは動作しますか?実行時には、実行しているexeに応じてすべてが32または64になりますが、プラットフォーム固有のdllを含むAnyCPUを対象とするプロジェクトを処理する時間をコンパイルできますか?あるいは、すべてのC#dllのプラットフォーム固有のバージョンを作る必要がありますか? ありがとうC#AnyCPUプロジェクトにプラットフォーム固有のdllが含まれている可能性があります
5
A
答えて
3
私が覚えている限り、これは機能します。
私は32ビットのDLLしか持っていませんでしたが、コンパイル時に起動時にクラッシュしました。したがって、64ビットのDLLをそこに置くと、C#を再コンパイルする必要はありません。
2
私はそれをしました。それはコンパイルの警告を出すが。
2
私は過去にこのようなアプローチを使用していましたが、うまくいきます。どのようなコンパイルの警告を得るのですか?
8
これは主に、適切なオペレーティングシステム用に適切なDLLが選択されている展開問題です。 x86用とx64用の2つのセットアッププロジェクトを作成するとかなり簡単です。
透明にすることも可能です。たとえば、EXEを含むディレクトリにx86とx64のサブディレクトリを作成し、そのサブディレクトリにDLLの32ビットと64ビットのビルドをそれぞれ入れます。起動時に、IntPtr.Sizeをチェックしてプロセスのビット数を確認します。それに応じて、Windowsが正しいDLLを見つけるようにSetDllDirectoryを適切にピンボケします。このように:
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
...
public static void SetupDllDirectory() {
string path = Assembly.GetEntryAssembly().Location;
path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86");
bool ok = SetDllDirectory(path);
if (!ok) throw new System.ComponentModel.Win32Exception();
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string path);
DLLをコピーするにはポストビルドイベントを使用します。 Environment.SetEnvironmentVariable()を使用してディレクトリをPATH環境変数に追加することは、もう一つのアプローチです。
関連する問題
- 1. .NET AnyCPUプロジェクトは、プラットフォーム固有のライブラリに
- 2. Delphi DLLがアンロードされていない可能性があります.GDIがまだ割り当てられている可能性があります。
- 3. どのファイルが含まれている可能性がありますか?
- 4. Regex for Java SimpleDateFormatパターン(出産に固有の可能性があります)
- 5. データグリッド列に別の行の異なるコントロールタイプが含まれている可能性があります
- 6. このターゲットには独自の製品が含まれている可能性があります
- 7. VC++のATL DLLがクラッシュする可能性があります - 32ビット/ 64ビットの問題に関連する可能性があります
- 8. GDまたはImageMagickが既にクライアントのPHPインストールに含まれている可能性はありますか?
- 9. メモリリークの可能性があります。
- 10. Remotingがクラス内にある可能性があります
- 11. メモリアクセスに問題がある可能性がありますか?
- 12. C#コンソールアプリもクラスライブラリとして機能する可能性がありますか?
- 13. PHPでビットが操作されていない可能性があります。
- 14. 変数が初期化されていない可能性があります
- 15. Valriableが初期化されていない可能性がありますか?
- 16. C++世界にスレッド固有のクロックがありますか?
- 17. Webアプリケーションのプリロード/キャッシュが悪い可能性があります
- 18. MonoDevelopプロジェクトの "OutputPathプロパティがプロジェクトProjectName.csprojに設定されていません"というエラーが発生する可能性があります
- 19. Ruby sort_by複数のフィールドにはゼロ値が含まれる可能性があります
- 20. NullPointerExceptionがInheritableThreadLocalに関連している可能性があります
- 21. SQLite、binフォルダにプラットフォーム固有のdllをコピーする
- 22. IntegrityError:App_userprofile.user_idがNULLでない可能性があります。
- 23. Django IntegrityError signup_simplesubscriber.date_createdがNULLでない可能性があります
- 24. ポインタがデータコピーを持たないベクトルによって所有される可能性はありますか?
- 25. java.lang.IllegalStateException:resourceIdToResNameの重複が発生している可能性があります
- 26. C#/ .Net Webブラウザは悪用される可能性がありますか?
- 27. 複数のネストされたループがある可能性があります
- 28. マルチプラットフォームC++プロジェクト:プラットフォーム固有のソースの追加
- 29. スタックサイズやオーバーフローの可能性があるメソッドが多すぎる可能性はありますか?
- 30. コンパイルエラー:cpumask.h: "and"がマクロパラメータリストに表示されない可能性があります