[英]c# strong name assembly reflection load interface cast problem
我已經隔離了我用於分布式測量和數據解釋的以下問題(當 impl 知道如何處理數據及其在示例中不存在的 UserControl 代表它們時)。
我在解決方案中有 3 個不同的項目:1)接口(單獨的 dll)
namespace inter
{
public interface IInter
{
byte[] results();
}
}
2)實現類(單獨的dll)
using inter;
namespace impl
{
public class impl : IInter
{
public byte[] results()
{//dummy data production
return new byte[10].Select((ii, index) => (byte)index).ToArray();
}
}
}
3)運行問題的程序......
using inter;
using impl;
namespace test_class_casting
{
class Program
{
static void Main(string[] args)
{
var path = @"C:\Users\pavel\source\repos\test class casting\impl\bin\Debug\impl.dll";
var b = File.ReadAllBytes(path);
var assembly = Assembly.Load(b);
IInter inst = null;
var expTypes = assembly.GetExportedTypes();
foreach (var d in assembly.GetExportedTypes())
{
var obj = Activator.CreateInstance(d);
if (obj is IInter)
{
inst = obj as IInter;
try
{
var res = inst.results();
continue;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
Environment.Exit(0);
}
}
}
try
{
var reType = (impl.impl)inst;// as impl.impl;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
Environment.Exit(0);
}
Console.WriteLine("...");
Console.ReadKey();
}
}
}
問題是 reType 轉換將失敗,因為[A]impl.impl 不能轉換為 [B]impl.impl。 異常消息。 我怎樣才能讓 wotk 腳本識別兩種類類型是相同的。 (注意。我無法將引用鏈接到項目中,實現impl類是用戶的責任,所以我什至不了解它們。
我什至嘗試為 inter 和 impl 添加一個強名稱,但現在取得了進展。 你有這個解決方案嗎?
畢竟,經過一些程序集研究后,我找到了解決方案。 每次動態加載程序集時,代碼都可以檢查它是否已經在 AppDomain.CurrentDomain.GetAssemblies() 中(通過 FullName 屬性檢查)。 即,如果程序集引用到項目。
如果不存在,則使用新程序集並創建來自其 GetExportedTypes() 的實例。
如果已經存在,則使用已加載的實例創建實例。 示例代碼在這里https://www.dropbox.com/s/hbs0ndwh8cf3uq0/test%20class%20casting-resolved.zip?dl=0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.