紀錄一下 太久沒有寫反射惹,然後遇到一個小問題,所以筆記一下免得自己又再次忘記,主要我有一個專案這邊叫做 Plugin.dll 因為我有寫一個 function 裡面會用到 JSON.net ,之後呼叫就發生
Exception
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json,
Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. 系統找不到指定的檔案。

要被呼叫的 Class ,這裡面我有使用到 JSON.net
C# Code:
public class User
{
public string Name { get; set; }
public DateTime Birth { get; set; }
}
public class Main2 : IScylla
{
public int Version { get { return 1946; } }
public string Name { get { return "MAIN2"; } }
public string Input { get; set; }
public string InvokeScylla(string input)
{
var u = JsonConvert.DeserializeObject(input);
u.Name += "--ScyllaDLL1";
u.Birth = u.Birth.AddYears(196);
return JsonConvert.SerializeObject(u);
}
}
反射端,這時候因為我本身專案沒有引入 JSON.net 所以必須要先 LoadFrom
C# Code:
public static string LoadAndInvoke(string ddlPath, string className, string input)
{
Assembly assembly = Assembly.LoadFrom(ddlPath);
Assembly.LoadFrom(@"C:\\Users\\donma\\source\\repos\\sample\\ScyllaDLL1\\bin\\Debug\\netcoreapp3.1\\lib\\Newtonsoft.Json.dll");
foreach (var t in assembly.GetTypes())
{
if (t.IsClass && t.Name == className)
{
return (Activator.CreateInstance(t) as IScylla).InvokeScylla(input);
}
}
throw new EntryPointNotFoundException("I cant Find class.");
}
var u = new User();
u.Name = "許當麻";
u.Birth = new DateTime(1983, 6, 21);
var uJSON = JsonSerializer.Serialize(u);
var result = Scylla.Helper.LoadAndInvoke(@"C:\\Users\\donma\\source\\repos\\sample\\ScyllaDLL1\\bin\\Debug\\netcoreapp3.1\\ScyllaDLL1.dll", "Main2",uJSON );
Console.WriteLine(result);
之後就可以成功呼叫了,雖然很簡單,因為太久沒寫了,花了一點時間猜了一下,因為關鍵字也不好下。