簡體   English   中英

如何在C#中訪問動態加載的clr / cli庫的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM