[英]How to access class of dynamically loaded clr / cli library in C#
我是CLR / CLI和C#的新手。 我的C#項目中有一個clr / cli庫。 我想動態加載它並在C#中訪問其類的功能。 有人可以提供一些示例或正確的方法嗎?
這是我的Clr / cli庫中的類聲明的頭文件
namespace ManagedLibDarkClient {
public ref class AccountHandler
{
public:
AccountHandler()
{
}
static bool RegisterAccnt(String^ accountID, String^ authCode);
};
}
請在下面我嘗試訪問它的C#類的函數下找到:-
private void RegisterWindow_ValidateEvent(object sender, ValidateEventArgs e)
{
Assembly assembly = Assembly.Loadfile("C:\\darkmailWindows\\darkmailwindows\\Dependencies\\ManagedLibDarkMail\\Lib\\ManagedLibDarkClient.dll");
if (assembly != null)
{
Type type = assembly.GetType("AccountHandler");
var obj = Activator.CreateInstance(type);
if (obj != null)
{
string[] args = { e.AccntInfo.AccntName, e.AccntInfo.AuthCode };
type.InvokeMember("RegisterAccnt", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args);
}
else
MessageBox.Show("Unable to laod object");
}
else
MessageBox.Show("unable to load assembly");
}
}
在此示例中,我面臨2個問題:-1- LoadFile掛起,沒有返回任何東西。 2-我不知道如何獲取我的clr / cli函數的返回值。
在這里,我想提一件事。 如果我靜態鏈接它們,則可以訪問clr / cli。 但是我必須動態加載它。 這對我來說是至關重要的要求。
首先,關於加載問題,請檢查工作目錄中是否存在C ++ / CLI庫的所有本機依賴項(dll)。
制作包含接口的第三個裝配
public interface IAccountHandler
{
bool RegisterAccnt(String accountID, String authCode);
}
從您的C ++ / CLI和C#項目中添加對此程序集的引用
在C ++ / CLI中:
public ref class AccountHandler : public IAccountHandler
{
public:
AccountHandler()
{
}
bool RegisterAccnt(String^ accountID, String^ authCode);
};
然后,在C#中:
string filename = "C:\\darkmailWindows\\darkmailwindows\\Dependencies\\ManagedLibDarkMail\\Lib\\ManagedLibDarkClient.dll";
Assembly asm = Assembly.LoadFrom(filename);
foreach (Type t in asm.GetTypes())
{
if (t.GetInterfaces().Contains(typeof(IAccountHandler)))
{
try
{
IAccountHandler instance = (IAccountHandler)Activator.CreateInstance(t);
if (instance != null)
{
instance.RegisterAccnt(e.AccntInfo.AccntName, e.AccntInfo.AuthCode);
}
}
catch(Exception ex)
{
//manage exception
}
}
}
我認為您不需要使RegisterAccnt靜態。
您還可以添加引用,就像從GAC注冊或並排的程序集進行鏈接一樣,並在加載失敗時手動處理ResolveAssembly事件。 請參閱此問題的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.