More than one method is found with VB but not with C#

D

De Roeck

Hi,

I've want to launch an application by reflection and get his handle
back.

But when I run this code in C# then it's handled correctly.
The application(-path) is started on a new thread and obj is the hwnd
of the started application.

private static BindingFlags allFlags = BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;

public static object StartAUT(string applicationPath, string typeName)
{
try
{
Assembly asm = Assembly.LoadFrom(applicationPath);
Type typeUT = asm.GetType(typeName);
object obj = Activator.CreateInstance(typeUT);
MethodInfo mi = typeUT.GetMethod("Show", allFlags);
mi.Invoke(obj, null);
return obj;
}
catch{}
return null;
}

but when I launch this code in VB.NET than I received an
AmbiguousMatchException execption.


Private Shared allFlags As BindingFlags = BindingFlags.Public Or
BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.Instance

Public Shared Function StartAUT(ByVal applicationPath As String, ByVal
typeName As String) As Object
Try
Dim asm As System.Reflection.Assembly =
System.Reflection.Assembly.LoadFrom(applicationPath)
Dim typeUT As Type = asm.GetType(typeName)
Dim obj As Object = Activator.CreateInstance(typeUT)
Dim mi As MethodInfo = typeUT.GetMethod("Show", allFlags)
mi.Invoke(obj, Nothing)
Return obj
Catch
End Try
Return Nothing
End Function


What do I wrong?

Greetings,
Davy
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

You are catching any exception that might occur in the method and
ignoring it. Start by at least throwing the exception again, so that you
see it.
 
D

De Roeck

When I go through all the methods with .methods,
then I found in VB-language two methods with that name,
but only 1 in C# (and there should only one)
 
T

Theo Verweij

I think both C# and VB are right from there respective points of view.
C# is case sensitive, VB is not.

So, when you have a function named "Show" and another function named
"show" in the assembly, and you are asking for the info of the method
"Show", then C# will find one and VB will find two.

If you add the flag BindingFlags.IgnoreCase to the c# version, I think
you will also get 2 functions in C#.
 
D

De Roeck

I've futher analysed the differences and found that in Reflector that
there are two Show-methods

Public Sub Show()
Public Sub Show(ByVal owner As IWin32Window)

I want to invoke the first one, that without paramaters
so I use:

VB.NET
-------
Dim asm As System.Reflection.Assembly =
System.Reflection.Assembly.LoadFrom(applicationPath)
Dim typeUT As Type = asm.GetType(typeName)
Dim obj As Object = Activator.CreateInstance(typeUT)
Dim mi As MethodInfo = typeUT.GetMethod("Show", allFlags)
mi.Invoke(obj, Nothing)
------

But he also invoke the second method (of show).

when I run the same in C# then he only invokes that one without
paramters:

C#
------
Assembly asm = Assembly.LoadFrom(applicationPath);
Type typeUT = asm.GetType(typeName);
object obj = Activator.CreateInstance(typeUT);
MethodInfo mi = typeUT.GetMethod("Show", allFlags);
mi.Invoke(obj, null);
 
D

De Roeck

I've futher analysed the differences and found that in Reflector that
there are two Show-methods

Public Sub Show()
Public Sub Show(ByVal owner As IWin32Window)

I want to invoke the first one, that without paramaters
so I use:

VB.NET
-------
Dim asm As System.Reflection.Assembly =
System.Reflection.Assembly.LoadFrom(applicationPath)
Dim typeUT As Type = asm.GetType(typeName)
Dim obj As Object = Activator.CreateInstance(typeUT)
Dim mi As MethodInfo = typeUT.GetMethod("Show", allFlags)
mi.Invoke(obj, Nothing)
------

But he also invoke the second method (of show).

when I run the same in C# then he only invokes that one without
paramters:

C#
------
Assembly asm = Assembly.LoadFrom(applicationPath);
Type typeUT = asm.GetType(typeName);
object obj = Activator.CreateInstance(typeUT);
MethodInfo mi = typeUT.GetMethod("Show", allFlags);
mi.Invoke(obj, null);
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top