2014-01-11 75 views
1

我已經嘗試使用/ CLR加載使用反射VB.net負載DLL

Imports System.Reflection 

一個DLL我有一個簡單的DLL文件用C++編寫(這是整個文件)

using namespace System; 


namespace ASSEMBLE{ 

public class REM{ 
    public: 
     int VALUE(){ 
      return 100; 
     } 

    }; 

}; 

而且在我的VB.net比唐單擊事件我有

Dim dllPath As String = "C:\Users\richard\Documents\Visual Studio 2012\Projects\link\link\bin\Release\dlltest.dll" 
     ' load the assembly 
     Dim assembly1 As System.Reflection.Assembly = Assembly.LoadFrom(dllPath) 
     ' get the type 
     Dim t As Type = assembly1.GetType("ASSEMBLE.REM") 
     ' create an instance and add it. 
     Dim c As Object = Activator.CreateInstance(t) 


     MsgBox(t.InvokeMember("VAULE", BindingFlags.Default Or BindingFlags.InvokeMethod, Nothing, c, {})) 

當事件觸發(即我加載DLL)。我得到的錯誤:

Method 'ASSEMBLE.REM.VALUE' not found 

使用:

<DllImport("DLL.dll")> Public Shared Function VALUE() As Integer 
     End Function 

是不是一種選擇。我需要在運行時加載DLL。

回答

0

您的REM類是非託管類,因此反射看不到它的方法。使用/ CLR編譯選項不會自動強制所有類進行管理。它只是讓你在你的項目中擁有託管類。

要允許呼叫InvokeMember,您需要將REM設置爲託管類。這可以通過將ref添加到類聲明中來完成,如下所示:

 
public ref class REM{ 
    ... 
};