Invoking A Method From A Class Dynamically With Reflection?
Oct 15, 2010
I'm making a little program in where i'm trying to invoke a method from a class dynamically with so called Reflection.The class I'm trying to call is called ContactList and i try to invoke the method in this class called count. The assembly itself is called Contact.ExeNow I have the following code:
Public Function InvokeContacts() As Integer
Dim ContactsAssembly As Assembly = Assembly.LoadFrom("Contacts.exe")
Dim Mycontactlist As Type = ContactsAssembly.GetType("ContactList")
I am loading an assembly dynamically and invoking a static method from it. The problem arises when the method uses a reference which is not trivial (e.g. mscorlib or System.Core) - I get System.MissingMethodException. I have tried going through the references assemblies of the loaded assembly and manually loading them all, thus forcing them to be loaded onto the AppDomain. I have checked CurrentDomain.GetAssemblies, the assemblies are loaded.
I'm trying to make a very simple audio tag editor. The idea is that the user can select as many audio files as he likes from a ListView, and a PropertyGrid will then display their tags + their values.When multiple files are selected, I want the property grid to display the values of the tags that all files have in common, and display empty values for tags that the files do not have in common.As an example, look at the properties list in your Visual Studio IDE when you select multiple controls (of the same type for this matter). Select a few Button controls, for example, and notice that the properties whose values are the same (often things like Font, ForeColor, etc) are displayed. Also notice that the values for properties that are not the same (Text, Name, etc) are empty.
eg: dim classobj = xyz("CLASS_NAME") ' where classname is a valid class name and dynamically raising a known method of that class on that newly created object or class reference.
Which always calls a method with no params or return. The idea is that the user of my object (transactional processing of business logic) inherits the base class adds in a load of private methods to fire. They then add these method names to a list in the order they would like them fired and the code above will take care of firing them.
It works fine with public methods but not with private or protected methods in the same class (Protected because I have some 'standard' pre built methods to add to the base class). Realistically I could make the methods public and be done with it but my inner nerd wont allow me to do so...
I am assuming this is a security feature. Is there a way to get around this or does anyone have any suggestions on how to proceed but keep my tasty, tasty visibility modifiers in tact?
(NOTE: ITS IN VB.NET but a C# Answer is fine if that is what you are comfortable with).
I have had several occasions recently to access a specific class several times over a relatively small time frame.So I've been storing the value of the class in Session and trying to access it on page load, if it's not available creating a new instance and storing that in session.
So instead of constantly replicating the same code for different classes on different pages I'm trying to create an extension method to do this for me.
[Code]...
I'm stuck on what to do when I make my new instance of my class (it would have to have a New() sub)
I'm not sure where to go from here... or even if this is the best way to do it.
I have an interface ITest with a method GetResult(). I have a class Test which implements ITest and thereby defines private method GetResult().
Next I create an instance of Test in a different class. The code is as below:
Module NewClass Public Sub New() Dim i As ITest = New Test()
[Code]....
I am migrating existing code from VB 6 to VB.NET and hence I'm not supposed to change the access modifier of GetResult. Leaving it Private will throw InvalidCastException Unable to cast object of type 'System.Object' to type 'ITest'
Object type variable o is used in many places and hence I don't want to change that. And yes, Test implements ITest.GetMember with a different name.
I'm converting a VB6 app to vb.net.The code creates objects using the CallbyName function with the classes name & and method being read from a database.I want to rewrite the classes in vb.net and have the same behaviour as I read in the name of an object from the database, instantiate it, and call one of it's methods.I don't know ahead of time what the names of the classes will be, so I can't make a reference to them in my project.
Consider a MyForm class that contains a shadowed implementation of Show(). It also contains a CreateForm() method, which accepts an instance of the form and calls the shadowed sub:
I've created a MyFunc extension (in Module Extensions) for all the base types as well as generic arrays, ICollection(Of T) and Dictionary(Of String,T):
Function MyFunc(Of T)(a() As T) As String Function MyFunc(Of T)(collection As ICollection(Of T)) As String Function MyFunc(Of T)(dict As Dictionary(Of String,T)) As String
I'm designing a .NET-Type at runtime by using the Reflection.Emit-Namespace. Currently, I'm about to generate a method which invokes an already existing method in the generating class:
I have tried several versions of this with no luck. The casting of the worksheet works as my data is entered in other parts, but I have a section where I need to add data 1 column right of the cell containing the 'str(0)' value. Most of these parameters are optional. I have even tried the System.Reflection.Missing object.
Our company has an app that load their components by System.Reflection.Load (By the way, an awesome technique )But, we start to monitorate the application and detect a extrange grow up of memory (actually when our application still all day on air, their allocate memory on task manager is 200 MB plus memory) And all of our components (60 plus DLLs) is load by this technique.My doubt is how to deallocate this assemblies or how the best way to deallocate any assemblies loaded by the System.Reflection.Assemblie.Load method?
I'm trying to use reflection to get the instance of a class in vb.net. I have a class 'A' in my web project and to test it, i create a new aspx page and try to write the following:
Dim t as Type = Type.GetType("A")
This returns "Nothing". But if i do this:
Dim inst as A = new A() Dim t as Type = inst.GetType() t's type is "A"
So how come i can't get the type with GetType even if the name is exactly the same? It does works for things like System.Math though
I'm trying to use reflection to populate the properties of an array of a child property... not sure that's clear, so it's probably best explained in code:
Parent Class: Public Class parent Private _child As childObject() Public Property child As childObject() Get Return _child [Code] .....
The issue is now trying to get that array assigned to the parent object (using reflection). It shouldn't be difficult, but I think the problem comes because I don't necessarily know the parent/child types. I'm using reflection to determine which parent/child is being passed in. The parent always has only one property, which is an array of the child object. When I try assigning the child array to the parent object, I get a invalid cast exception saying it can't convert Object[] to.
Basically, what I have now is: Dim PropChildInfo As PropertyInfo() = ResponseObject.GetType().GetProperties() For Each PropItem As PropertyInfo In PropChildInfo PropItem.SetValue(ResponseObject, ResponseChildren, Nothing) Next ResponseObject is an instance of the parent Class, and ResponseChildren is an array of the childObject Class.
This fails with: Object of type 'System.Object[]' cannot be converted to type 'childObject[]'.
I know its unlikely but I was wondering if there is any way to get the comments (i.e. the bits after the ''') of a class or property..? I have managed to get a list of properties of a class using the PropertyInfo class but I cant find a way to get the comments / description.. I need it for a guide I am writing for the administrators of my site - it would be great if it could automatically update if new properties are added, so there is no need to worry about updating it in the future too much.
how to create an instance of a class then add properties to the class, set those properties, then read them later. I don't have any code as i don't even know how to start going about this. C# or VB is fine.
My system has a dynamic form creator. one of my associates requires that the form data be accessible via web service. My idea was to create a class (based on the dynamic form) add properties to the class (based on the forms fields) set those properties (based on the values input for those fields) then return the class in the web service.
additionally, the web service will be able to set the properties in the class and eventually commit those changes to the db.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(_Class))
[code]....
How can I reach that sqlparameter collection via fieldinfo or other related classes in >NET Reflection?
What I wanted to do was, given the table name (as string), use reflection to instantiate the get method for specific fields (defined as properties with Get and Set methods.
Dim target As Object ' target gets properly set to something of the desired type Dim field As FieldInfo = target.GetType.GetField("fieldName", _ BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic) field.SetValue(target,newValue)
This snippet works perfectly IF target is set to an instance of a CLASS.However, if target is set to an instance of a STRUCTURE, the code does not actually change the value of the field. No error, but the value remains unchanged.And, oddly, if I'm stepping through code, watch the SetValue fail to do anything, and immediately go to the Immediate window and type exactly the same SetValue operation, that works.
Edit:
Per request from Jon Skeet, actual code: Private Shared Function XmlDeserializeObject(ByVal objectType As Type, _ ByVal deserializedID As String) As Object[code].....
I want to retrieve private (implementation and other) methods of a class which implements an interface and also is derived from (inherits) a base class.How can I achieve this using reflection?This is wat m tryin to do. I need to view these private methods and their contents, I don't want to invoke them.
Dim assembly As System.Reflection.Assembly Dim assemblyName As String assemblyName = System.IO.Path.GetFullPath("xyz.dll") assembly = System.Reflection.Assembly.LoadFile(assemblyName) assembly.GetType("myClass").Getmethods(Bindings.NonPublic) assembly.GetType("myClass").GetMethods(BindingFlags.NonPublic) isn't working
I know that the MenuItem class contains an internal class named MenuItemData, which contains itself an internal member named onDrawItem. Given a MenuItem, I want to retrieve the object corresponding to the member onDrawItem. But all I manage to do is to get the FieldInfo, not the object itself.
Here is my code: Dim obj As Object Dim fi As FieldInfo Dim item as System.Windows.Forms.MenuItem Dim mType As System.Type [Code] .....
I am working on a project where my class has to execute VB code provided by the user, to make it simple I am trying to recreate my own eval function, I am using the following code I found on the web to do this task.
The problem with code is that it can't access any variables or there values, so I have decided to get the variable names, there values types and there types dynamically and recreate them in the class that is being created dynamically. Any way to get the variable names there types and values in the current class or method, so that I can recreate them, and execute the user passed code, the user knows what variables are in the current class or method and there datatypes but he don't know there values as they may have changed, so he can't initialize them. Is there a way to do this, this code will be called in an asp.net page on page_load event, the code passed by the user is stored in the variable vbCode that is passed as a parameter.
Within the Company.Project.vbproj assembly, I have a class FriendClass.vb which scope is Friend (internal in C#).Now I wish to test this FriendClass.vb from within the Company.Project.Tests.vbproj assembly. I know about the InternalsVisibleToAttribute, but that is not an option in Visual Basic .NET 2.0, as it is only available with C#, in .NET 2.0 (see here).I would like to create myself a proxy class using this internal FriendClass from within my testing assembly, so that I could instantiate it and do the testings accordingly.
I am just curious, if there is some way to attach handler to my derived classes base event, if I know EventInfo and I have Delegate to handler function. I have tried MyEvent.AddHandler(CType(Me, BaseClassType), MyDelegate) already, but no positive result at all. Consider being in need of attaching handler to custom event at runtime, while derived class possibly shadows this event.
I've been creating short test apps repeatedly to try to understand some of the concepts in VB.NET.For the most part it has been illuminating.I read Bucky's .NET knowlegebase tutorial on passing objects as parameters to newly created forms. He shows how to create a new class that inherits from the base form class and define a New() method with parameters Extending the concept I thought about doing the same thing with a form that was created at design-time (In this case Form2).