2014-12-15 5 views
0

리 호스트 된 워크 플로우 디자이너에서 시스템 활동에 대한 GUID를 가질 수 있습니까?시스템 용 GUID는 C#에서 워크 플로우 작업을 제공했습니다

내가 만든 각각의 모든 활동에 대해 GUID를 갖고 싶습니다 (제공된, for, switch 등).

나는 IAttachedPropertyStore가 갈 방법이지만 시스템 제공 activties 내가 생각하는 이들을 구현하지 읽었습니다. http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

모든 의견이나 아이디어를 환영합니다. 이러한 guid는 이러한 흐름을 다른 도구로 가져 와서 수정할 수 있어야합니다.

답변을 위해 다른 정보가 필요한지 물어보십시오.

답변

0

액티비티에서 가이드로 1 : 1 맵 만 있으면 어셈블리 정규화 된 이름을 해쉬하는 것으로 간주하십시오. 이러한 작은 입력 집합을 사용하면 16 바이트 해시로 충돌을 얻을 수 있다고 생각하지 않습니다.

var targetAssemblies = new[] { typeof(Activity).Assembly }; 
var knownActivities = new Dictionary<Guid, Type>(); 
var baseType = typeof(Activity); 
var sha1 = new SHA1CryptoServiceProvider(); 

foreach (var t in targetAssemblies.SelectMany(a => a.GetTypes())) 
{ 
    if (t.IsPublic && !t.IsAbstract && baseType.IsAssignableFrom(t)) 
    { 
     var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(t.AssemblyQualifiedName)); 

     // hash is 20 bytes long, we are truncating it to 16 to fit the guid 
     var guidData = new byte[16]; 
     Buffer.BlockCopy(hash, 0, guidData, 0, 16); 
     var typeGuid = new Guid(hash.Take(16).ToArray()); 

     if (knownActivities.ContainsKey(typeGuid)) 
     { 
      throw new InvalidOperationException("Collision"); 
     } 
     knownActivities.Add(typeGuid, t); 
    } 
}