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