簡體   English   中英

c#強名稱程序集反射加載接口強制轉換問題

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

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