2012-02-20 8 views
3

アセンブリ名から厳密な名前を削除する方法を探していました。 シリアライズに使用しましたが、他のものにも使用できると仮定しています。正規表現を使用してシリアライズしている間にアセンブリから厳密な名前を削除します

private Regex _assemRegex = new Regex("(?<assembly>^.*?),.*"); 
    Regex reg = new Regex("(?<type>.*?), PublicKeyToken(=.*?)](?<end>.*)"); 
    //assume that all replacement types are in the same assembly with TypeReplacer 
    static readonly string assembly2Use = System.Reflection.Assembly.GetExecutingAssembly().FullName; 

    public override Type BindToType(string assemblyName, string typeName) 
    { 
     // remove strong name from assembly 
     Match match = _assemRegex.Match(assemblyName); 
     if (match.Success) 
     { 
      assemblyName = match.Groups["assembly"].Value; 
     } 

     // remove strong name from any generic collections as many time as needed 
     match = reg.Match(typeName); 
     string typeWithoutSN = typeName; 
     while (match.Success) 
     { 
      typeWithoutSN = string.Format("{0}]{1}", 
      match.Groups["type"].Value, 
      match.Groups["end"].Value); 
      match = reg.Match(typeWithoutSN); 
     } 

     // replace assembly name with the simple assembly 
     // name - strip the strong name 
     string type = string.Format("{0}, {1}", typeWithoutSN, 
     assemblyName); 

     // The following line of code returns the type. 
     return Type.GetType(type); 
    } 
+2

おかげで、多分あなたはこの質問への答えとして、コードを置くことができ、後でそれを受け入れる(時間制限あり)そうすれば人々はこのポストに答えるつもりはない。 – gideon

+0

良いコメントgideon、後でやります(現時点ではできません) –

答えて

2

としては、コードが答えとしてマークされ、要求:共有のため

private Regex _assemRegex = new Regex("(?<assembly>^.*?),.*"); 
Regex reg = new Regex("(?<type>.*?), PublicKeyToken(=.*?)](?<end>.*)"); 
//assume that all replacement types are in the same assembly with TypeReplacer 
static readonly string assembly2Use = System.Reflection.Assembly.GetExecutingAssembly().FullName; 

public override Type BindToType(string assemblyName, string typeName) 
{ 
    // remove strong name from assembly 
    Match match = _assemRegex.Match(assemblyName); 
    if (match.Success) 
    { 
     assemblyName = match.Groups["assembly"].Value; 
    } 

    // remove strong name from any generic collections as many time as needed 
    match = reg.Match(typeName); 
    string typeWithoutSN = typeName; 
    while (match.Success) 
    { 
     typeWithoutSN = string.Format("{0}]{1}", 
     match.Groups["type"].Value, 
     match.Groups["end"].Value); 
     match = reg.Match(typeWithoutSN); 
    } 

    // replace assembly name with the simple assembly 
    // name - strip the strong name 
    string type = string.Format("{0}, {1}", typeWithoutSN, 
    assemblyName); 

    // The following line of code returns the type. 
    return Type.GetType(type); 
} 
+0

実行中のアプリケーションでStrong Nameを削除したい場合、このコードを実行しますか?これを呼び出す方法のいくつかの例がありますか?例えば、私はこれを以下のように呼ぶでしょう: 'BindToType(" project1.exe "、" System.Windows.Form ");'? – jp2code

+1

serializatonbinderクラスをオーバーライドする必要があります –