2016-10-12 8 views
1

プラットフォームターゲットがx86に設定されていない場合、どのようにコンパイラエラーを生成できますか?プラットフォームターゲットがx86でない場合コンパイラエラーを生成します

動機づけ:特定のメソッドは、32ビットのCOM DLLを動的にロードします。プロジェクトが "x64"または "Any CPU"用に構築され、64ビット環境で実行されている場合、COMオブジェクトの自然なロードは実行時に失敗します。私はコンパイル時のチェックを行い、これが起こり得ないことを確認します。

これは、32ビットを必要とするソースファイル内に完全にカプセル化されたプロジェクト設定の安全性チェックを目的としています。だから私は、プロジェクト設定で条件付きコンパイルシンボルを定義する必要がある解決策(例えばthisなど)を受け入れることができません。あなたがこれを行うにはロスリン診断分析器を書き込むことができます

#if PLATFORM_X86 
    #error Target platform needs to be x86! 
#endif 
+0

これはXYの問題のようです。 COM +(DCOM)を介して専用のサーバープロセスでCOMコンポーネントをホストすることをお勧めします。こうすることで、コンポーネントの周りに 'dllhost'プロセスが起動し、呼び出しをマーシャリングします。これらはクロスプロセスコールなので、C#プロジェクトのビット数はそれ以上重要ではありません。 –

+0

@FrédéricHamidiそれを提案してくれてありがとう。これは私が避けたかったものです。これを64ビットで実行する利点はありません。 –

+0

[ここ](http://www.hanselman.com/blog/BackToBasics32bitAnd64bitConfusionAroundX86AndX64AndTheNETFrameworkAndCLR.aspx)の説明に従って、IntPtr.Sizeを評価することができます。 –

答えて

0

はあなたのような何かをしようとしませんでした。

まず、検索するコードに何かを書きます。たとえば、属性を使用できます。それは例えば、アセンブリレベルの属性のようになります。

[assembly: Require32bit] 

それはまた、あなたがクラスに適用された属性または選択したとして、COMコンポーネントを呼び出しても、方法である可能性があります。

次に、この存在を検索するアナライザーを作成します。アナライザでは、Compilation.Options.Platformプロパティを使用してプラットフォームを特定できます。コンパイルは、例えば、 SyntaxNodeAnalysisContext

+0

正直言って、私はこれを正確にはテストしていませんが、数ヶ月前に似たようなものです。それがあなたのために働くなら、私は家に帰ると(6時間で)それを試すことができますか? – Gnqz

+0

悲しいことに、それは動作しません。 PLATFORM_X86シンボルはありません。 (はい、私は1つを定義することができましたが、コードが別のプロジェクトで使用されている場合は保護されません) –

+1

条件付きコンパイルシンボルとして追加しましたか? [ビルド]タブにあります。 – Gnqz

1

+0

アナライザーをプロジェクトにNugetパッケージとして追加する必要があります。それはあなたが使用する属性がどこかから来る必要があり、同じNugetパッケージに入っている可能性があるため、それほど悪くはありません。 (あるいは、.vsixを使用してVisual Studioにアナライザをインストールすることもできますが、このシナリオではNugetソリューションが必要です)。Roslynアナライザを読む必要があります。これはあなたを起動させるはずです:https://www.bing.com/search?q=developing+roslyn+diagnostic+analyzer –

+0

ソースコードがあるDLLへの参照を必要とする場合、その他のプロジェクトはそのDLLを参照する必要がありますコンパイルするには、右か?これは、属性を含むものだけでなく、参照する* DLLの場合です。だから、彼らはとにかく参照を追加する必要があります。Nugetパッケージを介して属性を持つDLLを参照し、そのNugetパッケージにもアナライザが含まれていると、アナライザはすべてのビルドで自動的に実行されます。 –

+0

いいえ、COMオブジェクトは動的に読み込まれます。 ( 'Type.GetTypeFromProgID()'、 'Activator.CreateInstance()'のように)あなたが記述した場合にはとても良い解決策です。 –

関連する問題