2012-04-27 2 views
3

をEnum.IsDefined。Eazfuscator.NETブレークは、私は多くの小さな列挙型を使用することが私のコードでは

bool valid_input = Enum.IsDefined(typeof(UserRequest), user_byte_value); 

このアプローチは、列挙型がFlagsAttributeを使用するときには機能しません。 Enum.IsDefinedは自動的にフラグを結合して指定された値にすることはできません。しかし、私はFlagsAttributeを必要としないで回避することができました。

しかし、Eazfuscator.NETの難読化はEnum.IsDefinedを破ります。私はそれが可能であることを知っていましたが、System.Reflection名前空間にないので、それは望んでいませんでした(しかし、それはSystem.Reflectionを大量に使用しています)。

誰かが良い選択肢を知っているのだろうかと思います。私は具体的に次のとおりです:

  1. 整数が指定された列挙型にあるかどうかを調べることができます。
  2. .NET Framework 2.0およびMono Frameworkと互換性があります。
  3. 明示的に無効にすることなく(属性またはGUIツールを使用して)難読化を継承します。
+2

「Eazfuscatorが自分のコードを壊す」という質問は常にあります。通常、「彼らは応答していません」。それを捨てなさい。 –

+0

@ HansPassant IIRC、私が使用した他の難読化ツールのいくつかはEnumを破損しません。定義されていますが、私はEazfuscatorを非難しません。私は、私が「enum guards」と呼んでいると思っている解決策を検討するかもしれません。 enum UserRequests:byte {Burp = 0、Sneeze = 1、Fart = 2、MAXVAL = 3} そして、指定された整数がそれと比較してフラグに入っているかどうかを確認することができますMAXVAL。 –

+0

[Crypto Obfuscator](http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm)を試してください。 enumベースのシナリオにはいくつかのインテリジェントな自動除外ルールがあります。免責事項:私はLogicNPソフトウェア、Crypto Obfuscatorの開発者のために働いています。 – logicnp

答えて

2

他の人がこの同じ問題に遭遇し、この記事を見つけた場合、私が行った解決策は、それぞれの列挙型に追加の列挙型メンバーを追加することでした。

enum UserRequests : byte 
{ 
    Burp = 0, 
    Sneeze = 1, 
    Fart = 2, 
    /* Maximum Valid Value */ 
    MAXVAL = Fart 
} 

これは私が列挙値を反復する(の#defineで(非ANSI))Cで使用して覚えて練習です、その唯一の欠点は、それが維持するのは難しいということです。

負担を軽減するための一般的な関数を書いています(下のヘッダーを参照)。私はまだMAXVALメンバーを明示的に渡す必要がありますが、思っていたよりも少ない仕事です。そしてもちろん、それは難読化を生き残り、移植可能です。

public static bool TryParseByteToEnum<T>(byte input_byte, 
    out T enum_member, T max_value) where 
     T : struct, IConvertible 
関連する問題