【发布时间】:2015-05-21 17:15:03
【问题描述】:
我正在尝试调用类“CMyClass”的方法“MyMethod”。这个方法有一个“CBaseClass”类型的参数,我正在传递一个“CDerivedClass”类型的对象。
Class CBaseClass
Public m_AMember As String
Sub MethodOne()
// DoSomething
End Sub
End Class
Class CDerivedClass
Inherits CBaseClass
Public m_MyMember As Integer
Sub MethodTwo()
// DoSomething
End Sub
End Class
Class CMyClass
Sub MyMethod(ByVal obj As CBaseClass)
// DoSomething
End Sub
End Class
Sub Main()
'load assembly
Dim objAssembly As Assembly = Assembly.LoadFrom("myfile.dll")
'create class instance and MethodInfo object
Dim t As Type = objAssembly.GetType("MyNamespace.CMyClass")
Dim obj As Object = Activator.CreateInstance(t)
Debug.Assert(obj IsNot Nothing)
Dim m As MethodInfo = t.GetMethod("MyMethod")
Debug.Assert(m IsNot Nothing)
'Init arguments (only one)
Dim par As New CDerivedClass()
Dim parameters As Object() = New Object(0) {par}
'invoke method
m.Invoke(obj, parameters) '<<<< ArgumentException here!
End Sub
参数异常说“'MyNamespace.CDerivedClass' 类型的对象无法转换为'MyNamespace.CBaseClass' 类型。
我在 MyMethod 签名中将“ByRef”更改为“ByVal”,但没有任何改变。 我尝试使用以下方法更改“par”对象的类型:
Dim par As CBaseClass = New CDerivedClass()
没有成功。 如何使用派生类的实例正确调用方法“MyMethod”? 非常感谢。
【问题讨论】:
-
您可能正在与加载上下文作斗争,请尝试使用 Load() 而不是 LoadFrom()。
-
也许你是对的?字节数组没有任何变化,但是使用 Load("ConsoleApplication1") 它运行(来自@Kratz 答案的来源)...但是在我的原始项目中,dll 位于相对于 exe 的另一条路径中,它没有找到它...我在互联网上搜索过,但我不知道如何使用 Load(AssemblyName)。我在某个路径中有很多 dll(例如“c:\my_dlls”),而我的调用项目在另一个路径中(例如“c:\myProjects\MyCallingProject\bin\debug\MyCallingProject.exe)。
-
Hmya,故意调用 DLL Hell 是一个非常严重的错误。使用 AppDomain.AssemblyResolve 事件帮助 CLR 查找存储在奇怪位置的 DLL。
-
在我的项目中,路径中有 N 个库。我不知道他们的名字,也不知道他们的 AssemblyNames 的信息。在加载程序集的指令之前,我有一个 for 循环读取在指定的库路径中找到的所有文件。
标签: vb.net reflection invoke