Hello, I'm Borut Jarc and I work at A.S.U.I.Ts (Azienda Sanitaria Universitaria Integrata di Trieste) as a Domain Admin.
I'm writing an C# 4.0 application to help my Network Admins to manage the subnets configured on our network switches. The application has Iron Python embedded, a simple plugin system and a plugin manager. The plugins are written in IronPython. Everything works fine so now I am writing a configuration dialog for the plugins properties. I'm trying to use a PropertyGrid which I give an instance of an IronPython class. To make use of all the nice features of PropertyGrid like Description, Category and PasswordPropertyText i extended the ClrClass from clrtype module from clrtye sample, implemeting the emit_property method as follows: class MyClrClass(ClrClass): def emit_property(self, typebld, prop, name, clrtype): prpbld = typebld.DefineProperty(name, PropertyAttributes.None, clrtype, None) if prop.fget: getter = self.emitted_methods[(prop.fget.func_name, prop.fget.arg_types)] prpbld.SetGetMethod(getter) if prop.fset: setter = self.emitted_methods[(prop.fset.func_name, prop.fset.arg_types)] prpbld.SetSetMethod(setter) if hasattr(prop.fget, "CustomAttributeBuilders"): for cab in prop.fget.CustomAttributeBuilders: prpbld.SetCustomAttribute(cab) then in my IronPython script I define the class: class OSCommware7_ssh(PluginBase): __metaclass__ = clrtype.MyClrClass _clrnamespace = "PianoIndirizzamentiIP_Tool" _clrfields = {"_username":str, "_password":str, "_prompt":str} Description = clrtype.attribute(DescriptionAttribute) Category = clrtype.attribute(CategoryAttribute) @property @Category("Credentials") @Description("Username for login on Core Switch") @clrtype.accepts() @clrtype.returns(str) def username(self): return self._username @username.setter @clrtype.accepts(str) @clrtype.returns() def username(self, value): self._username = value .... (PluginBase is the c# class with acts as the plugin skeleton. Contais also some plugin helper functions (password encryption decryption)) and in my c# code I do something like: ... _engine = Python.CreateEngine(); _scope = _engine.CreateScope(); _runtime = _engine.Runtime; _root_dir = AddAssemblies(); _scope = _engine.CreateScope(); ... ScriptSource script = _engine.CreateScriptSourceFromFile(path_to_python_script); CompiledCode code = script.Compile(); script.Execute(scope); ... dynamic plugin_instance = my_engine.scope.GetVariable("OSCommware7_ssh")() propertyGrid1.SelectedObject = plugin_instance; ... If I inspect plugin_instance with (System.Reflection.PropertyInfo[])(plugin_instance.GetType().GetProperties()): - ((System.Reflection.PropertyInfo[])(plugin_instance.GetType().GetProperties()))[3] {System.String username} System.Reflection.PropertyInfo {System.Reflection.RuntimePropertyInfo} Attributes None System.Reflection.PropertyAttributes CanRead true bool CanWrite true bool - CustomAttributes Count = 2 System.Collections.Generic.IEnumerable<System.Reflection.CustomAttributeData> {System.Collections.ObjectModel.ReadOnlyCollection<System.Reflection.CustomAttributeData>} + [0] {[System.ComponentModel.DescriptionAttribute("Username for login on Core Switch")]} System.Reflection.CustomAttributeData + [1] {[System.ComponentModel.CategoryAttribute("Credentials")]} System.Reflection.CustomAttributeData + Raw View + DeclaringType {Name = "OSCommware7_ssh" FullName = "PianoIndirizzamentiIP_Tool.OSCommware7_ssh"} System.Type {System.RuntimeType} + GetMethod {System.String username()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo} IsSpecialName false bool MemberType Property System.Reflection.MemberTypes MetadataToken 385875970 int + Module {Snippets.scripting} System.Reflection.Module {System.Reflection.Emit.InternalModuleBuilder} Name "username" string + PropertyType {Name = "String" FullName = "System.String"} System.Type {System.RuntimeType} + ReflectedType {Name = "OSCommware7_ssh" FullName = "PianoIndirizzamentiIP_Tool.OSCommware7_ssh"} System.Type {System.RuntimeType} + SetMethod {Void username(System.String)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo} + Non-Public members I see all the properties and their CustomAttributes set as expected, but for some reason PropertyGrid simply ignore them. I feel like I'm missing something important but I don't know what. Can someone explain me what I'm doing wrong? Thank you and forgive my poor English... Borut Jarc
_______________________________________________ Ironpython-users mailing list Ironpython-users@python.org https://mail.python.org/mailman/listinfo/ironpython-users