壊れにくくすることはできると思いますが、インターフェースを使うことはできません。
これがあなたがすることです:
2 + n個のプロジェクトが必要です。1つはexe用(program.exeと呼びます)、1つはコントラクト用(contracts.dll)、もう1つはn個のプラグイン(plugin.dll)用です。
program.exeには、plugin.dllと同様に、contracts.dllへのハードリファレンスがあります。
それらすべてに強力な名前キーで署名します。http://msdn.microsoft.com/en-us/library/xc31ft41.aspxを参照してください
インターフェイスILicenceQueryProviderの代わりに、contracts.dllに封印されたクラスLicenceQueryProviderを作成します。パブリックコンストラクター、内部コンストラクター、およびオブジェクトを変更するメソッド(構築時に初期化され、不変で、読み取り専用フィールドを使用)がないことを確認してください。
Contracts.dllにInternalsVisibleToAttributeのマークを付け、program.exeに内部コンストラクターへのアクセスを許可します。http://msdn.microsoft.com/en-us/library/System.Runtime.CompilerServices.InternalsVisibleToAttribute.aspxを参照してください
このようにして、program.exeはこのオブジェクトのコンストラクターを呼び出すことができ、plugin.dllはそこから読み取ることができます。
plugin.dllは、強力な名前署名のためにオブジェクトクラスが変更されていないことを「認識」しています。そして、それは封印されているので、真ん中の人は別の実装で代用することはできません。
さて、壊れにくくすることができると言ったことを思い出してください。しかし、それは不可能ではなく、特にマネージコードを使用している場合は決してそうなることはありません。
たとえば、中間者はリフレクションを使用して、内部コンストラクターでオブジェクトをインスタンス化できます。
さらに悪いことに、プラグインには、このオブジェクトから読み取り、ライセンス情報に基づいて決定を下すコードがあります。ハッカーはplugin.dllをILに逆コンパイルし、そのコードを常にすべての権限を付与するコードに置き換えることができます。
難読化は少しだけ役立ちますが、リフレクション攻撃に対しては役立ちません。ネイティブコードを使用すると多少難しくなりますが、ネイティブコードにパッチを適用することもできます。
最終的に、コードはハッカーのマシン上にあり、ハッカーは自分のやりたいことを実行できます。彼はそれをデバッガーで実行し、メモリ内のデータを変更することもできます。これは、すべてのコピー防止およびライセンスメカニズムが直面する問題です。私の意見では、ライセンスはクライアントがソフトウェアを使用するのを難しくし、断固としたハッカーを止めることはありません。あなた(またはあなたの会社)はあなたのクライアントがあなたのソフトウェアを使うのを難しくしたいですか?
これは、解決策がないという意味ではありません。実際には、ハッカーは自分のマシンにないコードを変更することはできません。自分の管理下にあるサーバーでコードを実行します。クライアントアプリは、Webサービスを介してそれにアクセスします。Webサービスはユーザーを認証します(呼び出し元のコードではなく、それは不可能です)。ユーザーを知ることで、サービスはユーザーのライセンスを検証できます。これが唯一の解決策です。
アップデート
明確にするために、このようなサービスは、ライセンスチェックだけでなく、ユーザーにとって価値のある実際のコードを実行する必要があります。後者の場合、ハッカーはクライアントを変更して、単に電話をかけないようにしたり、偽のライセンスサーバーに置き換えたりする可能性があります。ただし、ライセンスは、サービスに存在する実際のロジックを再作成するよりも安価であると想定されています。その場合、ハッカーでさえ、コードを再作成するよりも購入することを好みます。