我在VB.NET项目中使用interop dll来访问MFC项目中的某些函数。
Dim bIsSupposedToWork As Boolean = True
Dim api As API = GetObject(, "MyProject.API")
api.Function1() ' << Function1 returns void, and this works OK
' Function2 returns a long:
If Not bIsSupposedToWork Then
' This next line crashes the application with the message "ByRef value type parameter cannot be null"- error
api.Function2()
Else
' But this works fine:
Dim o As Object = api
o.Function2()
End If
为什么?
答案 0 :(得分:2)
您正在欺骗编译器,阻止它检查您编写的代码是否正确。 Object.Foo()调用是后期绑定的,它在运行时被整理出来,应该调用确切的函数。编译器无法进行任何检查,也不知道对象支持哪些方法。底层管道是COM的IDispatch接口。
毋庸置疑,这可能无法解决任何问题,只是在运行时发出巨响。
不确定为什么要这样做,MFC项目中的.idl可能缺少函数返回值的[out,retval]属性。