After obfuscation my application doesn't work:
System.Reflection.AmbiguousMatchException: Ambiguous match found.
at System.RuntimeType.GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, Type returnType, Type types, ParameterModifier modifiers)
at System.Type.GetProperty(String name)
at Csla.Core.FieldManager.DefaultPropertyInfoFactory.GetFriendlyNameFromAttributes(Type type, String name)
at Csla.Core.FieldManager.DefaultPropertyInfoFactory.Create[T](Type containingType, String name)
at Csla.BusinessBase`1.RegisterProperty[P](Expression`1 propertyLambdaExpression)
That's because obfuscator renaming properties using the same name.
So, I propose to add few methods to "IPropertyInfoFactory":
Csla.PropertyInfo<T> Create<T>(Type containingType, PropertyInfo propertyInfo);
And methods to "DefaultPropertyInfoFactory":
private static string GetFriendlyNameFromAttributes(PropertyInfo propertyInfo )
So obfuscating your business objects makes all the properties have the same name?
Which Obfuscator do you use?
This would likely break all your databinding or what - if the properties have the same name?
And is your suggestion to add System.Reflection.PropertyInfo as parameter to these method?
So my recommendation is to either:
1. NOT use PropertyInfoFactory and use other methods in the business object base classes to register PropertyInfo::
protected static PropertyInfo<P> RegisterProperty<P>(Type objectType, PropertyInfo<P> info)
This will register a PropertyInfo that YOUR code has create itself.
2. Create your own PropertyInfoFactory.
The other solution is that you create your own PropertyInfoFactory as this is an extension point in CSLA where you can configure CSLA to use your OWN PropertyInfoFactory and do whatever is necessary for your application to work as you expect. You could even create your own new version of RegisterPropertNew and call other methods in YOUR PropertyInfoFactory that accepts a PropertyInfo as parameter.
Most obfuscation programs have a way to mark certain properties/methods so they aren't renamed. There's no value in obfuscating the standard DataPortal_XYZ method names, so it is probably best to just prevent the tool from renaming those methods.
Thanks for reply.
I am new to CSLA. I'm learning CSLA and trying convert my existence project.
I always use obfuscation and love full obfuscation (cross-obfuscation) of private, protected and even public methods and properties. For now my obfuscation tool is "Spices.Net Obfuscator" (presented by the developer for assistance improved their product ).
"This would likely break all your databinding" - I forgot about this. I didn't have the problems with databinding because of using DataTable. I should think about it.
By the way, "Spices.Net Obfuscator" has option "Use unique name" but unfortunately it works only on single class. Derived class properties could be renamed with the same names as in base class.
I've just found an interesting project - "Truss" (http://truss.codeplex.com/)
It seems it's custom realization of databinding which supports any UI technology and It's working with "Expression", not only with strings. So I could bind properties with same name . But it has one disadvantage: no designer support. Any way, if you're obfuscating code you should do manual binding.
Copyright (c) Marimer LLC