国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 子類強制轉(zhuǎn)換為父類異常,引出的C#Dll加載機制,以及同類名同命名空間同dll程序集在C#中是否為同一個類的研究。

這篇具有很好參考價值的文章主要介紹了C# 子類強制轉(zhuǎn)換為父類異常,引出的C#Dll加載機制,以及同類名同命名空間同dll程序集在C#中是否為同一個類的研究。。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

已知,子類B繼承自父類A,但是在代碼運行時,B類強制轉(zhuǎn)換為A類,卻報代碼轉(zhuǎn)換異常。
很奇怪的問題吧,不過這個也是難得機會,去研究C#運行的底層原理。

下面是報錯的代碼片段。

string className = _shapeReflectMap[typeName].ClassName;
Assembly assem = _shapeReflectMap[typeName].Assem;
Object obj = assem.CreateInstance(className); // 在dll程序集中 通過className實例化獲取子類
Type type1 = obj.GetType().BaseType; // 獲取父類類型
Type type2 = typeof(Shape);
Assembly assembly1 = type1.Assembly;
Assembly assembly2 = type2.Assembly;
string codeBase1 = assembly1.CodeBase;
string codeBase2 = assembly2.CodeBase;
try
{
    shape = (Shape)obj;
}
catch (Exception e)
{
    throw new Exception("反射創(chuàng)建Shape失敗"
                        + "\n類型直接比較: " + (type1 == type2)
                        + "\n程序集直接比較: " + (assembly1 == assembly2)
                        + "\n類型全名比較: " + (type1.FullName == type2.FullName) + ": " + type1.FullName + " " + type2.FullName
                        + "\n程序集全名比較: " + (assembly1.FullName == assembly2.FullName) + ": " + assembly1.FullName + " " + assembly2.FullName
                        + "\ncodeBase1: " + codeBase1
                        + "\ncodeBase2: " + codeBase2
                        + "\n程序集路徑比較: " + (codeBase1 == codeBase2)
                        + "\ncodeBase1.hash: " + codeBase1.GetHashCode()
                        + "\ncodeBase2.hash: " + codeBase2.GetHashCode()
                        + "\n", e);
}

下面是報錯結(jié)果(其中的敏感字符串被替換成了xxx):

System.Exception: 反射創(chuàng)建Shape失敗
類型直接比較: False
程序集直接比較: False
類型全名比較: True: xxx.WpfPlugin.Shape xxx.WpfPlugin.Shape
程序集全名比較: True: xxx.WpfPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null xxx.WpfPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
codeBase1: file:///D:/project/XXX/xxx.xxxClient.UI/xxx.xxxClient.UI/bin/Debug/Plugins/xxx.WpfPlugin.dll
codeBase2: file:///D:/project/XXX/xxx.xxxClient.UI/xxx.xxxClient.UI/bin/Debug/Plugins/xxx.WpfPlugin.dll
程序集路徑比較: True
codeBase1.hash: -336973287
codeBase2.hash: -336973287
 ---> System.InvalidCastException: 無法將類型為“xxx.WpfPlugin.Shapes.ImageButton”的對象強制轉(zhuǎn)換為類型“xxx.WpfPlugin.Shape”。
   在 xxx.WpfPlugin.ctlUI.LoadXml(String xmlPath) 位置 D:\project\XXX\dll\PluginsSources\xxx.WpfPlugin\ctlUI.cs:行號 107
   --- 內(nèi)部異常堆棧跟蹤的結(jié)尾 ---
   在 xxx.WpfPlugin.ctlUI.LoadXml(String xmlPath) 位置 D:\project\XXX\dll\PluginsSources\xxx.WpfPlugin\ctlUI.cs:行號 111
   在 xxx.WpfPlugin.ctlUI.DisplayInit() 位置 D:\project\XXX\dll\PluginsSources\xxx.WpfPlugin\ctlUI.cs:行號 177

通過上面的代碼可以看出,從子類中獲取的父類type,和父類直接獲取的type是完全一樣的,命名空間,類名稱,程序集和對應的dll文件,均相同。但是通過==判斷,其在內(nèi)存中并非同一個對象。

經(jīng)過排查,發(fā)現(xiàn)代碼中對該dll加載了兩次,獲得了兩個程序集,而子類和父類分別來自不同的程序集,導致了無法進行類型轉(zhuǎn)換。在修復該dll加載邏輯后問題便得到了解決。

可以推測出,C#判斷兩個類是否完全相同,除了看命名空間和類名以外,主要是判斷兩個類是否在同一個程序集實體中(內(nèi)存中的同一個實體)。若一個dll加載了兩遍,獲得兩個程序集對象,雖然兩個程序集中的類完全相同,但是依然無法相互轉(zhuǎn)換。

所以程序集最好有一個公共的存放處,統(tǒng)一的加載邏輯,不要養(yǎng)成需要某個類時直接去加載一遍dll的壞習慣。
也可以通過Assembly.GetExecutingAssembly()直接獲取當前代碼所在的程序集,避免重復加載。文章來源地址http://www.zghlxwxcb.cn/news/detail-637177.html

到了這里,關(guān)于C# 子類強制轉(zhuǎn)換為父類異常,引出的C#Dll加載機制,以及同類名同命名空間同dll程序集在C#中是否為同一個類的研究。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • C# 提示:無法加載 DLL“XXX.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。

    C# 提示:無法加載 DLL“XXX.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。

    今天再調(diào)試程序時發(fā)現(xiàn)程序再筆記本上運行正常,然而拷貝到客戶主機上之后出現(xiàn)了(System.DllNotFoundException: 無法加載 DLL“msc.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。)的問題,經(jīng)過再三調(diào)試, 1、確認CPU平臺為x86,正常 2、dll的路徑,正常 經(jīng)過再三的排除,發(fā)

    2024年02月11日
    瀏覽(23)
  • 鏈式-父類中返回子類對象

    鏈式-父類中返回子類對象

    一晃五年沒寫博客了,依舊再C#上耕耘,依舊沒有啥建樹,現(xiàn)在也不知道.net上還有多少人再使用,在這里分享一些自己覺得寫的還算優(yōu)雅的代碼。 對于自己寫著完的代碼,我特別喜歡鏈式(來源于jQuery的影響吧),大部分時候鏈式就是將返回值為void類型的對象,返回this指針

    2024年02月05日
    瀏覽(22)
  • C++ | 繼承(基類,父類,超類),(派生類,子類)

    文章參考:https://blog.csdn.net/war1111886/article/details/8609957 一 .繼承中的訪問權(quán)限關(guān)系 1.基類,父類,超類是指被繼承的類,派生類,子類是指繼承于基類的類.? 2.在C++中使用: 冒號表示繼承,如class A : public B;表示派生類A從基類B繼承而來 3.派生類包含基類的所有

    2024年02月15日
    瀏覽(60)
  • c++和QT子類調(diào)用父類方法

    c++調(diào)用方式 : 父類名::方法名 QT調(diào)用方式 : __super::方法

    2024年02月13日
    瀏覽(16)
  • 【C/C++】父類指針指向子類對象 | 隱藏

    【C/C++】父類指針指向子類對象 | 隱藏

    創(chuàng)作不易,本篇文章如果幫助到了你,還請點贊 關(guān)注支持一下???)!! 主頁專欄有更多知識,如有疑問歡迎大家指正討論,共同進步! ??c++系列專欄:C/C++零基礎(chǔ)到精通 ?? 給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c語言內(nèi)容??:

    2024年02月11日
    瀏覽(23)
  • Java feign接口調(diào)用后返回子類,序列化子類反序列化只得到父類

    需要修改序列化方法 我存的時候放的子類,接收到卻是只有父類的數(shù)據(jù) feign默認使用jackson進行序列化,需要在父類上加上注解 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 在父類頭上增加注解: https://blog.csdn.net/qq_39493105/article/details/126061848

    2024年02月14日
    瀏覽(16)
  • java子類繼承父類方法、或者接口中方法的javadoc注釋

    java子類繼承父類方法、或者接口中方法的javadoc注釋

    詳情可以閱讀: https://docs.oracle.com/en/java/javase/19/docs/specs/javadoc/doc-comment-spec.html#method-comment-inheritance 子類繼承父類、或者子類實現(xiàn)接口,在子類中為了避免重復寫注釋,可以在子類方法注釋的主要描述部分、或者@return、@param、@throws標記后面的文本參數(shù)部分插入{@inheritDoc}標記

    2024年02月11日
    瀏覽(49)
  • 父類對象的屬性直接賦值給子類對象(使用copyProperties中的方法copyProperties)

    BeanUtils.copyProperties() 是 Apache Commons BeanUtils 包中提供的一個方法,用于將一個 JavaBean 對象的屬性值賦值到另一個 JavaBean 對象中。該方法可以簡化 JavaBean 之間的屬性復制過程,避免手動編寫大量的賦值代碼。 以下是 BeanUtils.copyProperties() 方法的基本用法: 在上面的例子中,首

    2024年02月15日
    瀏覽(37)
  • 【C++】 為什么多繼承子類重寫的父類的虛函數(shù)地址不同?『 多態(tài)調(diào)用匯編剖析』

    【C++】 為什么多繼承子類重寫的父類的虛函數(shù)地址不同?『 多態(tài)調(diào)用匯編剖析』

    ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《藍橋杯試題》 《LeetCode刷題筆記》 《實訓項目》 《C++》 《Linux》《算法》 ?? 每一個不曾起舞的日子,都是對生命的辜負 本篇文章主要是為了解答有關(guān)多態(tài)的那篇文章那塊的一個奇怪現(xiàn)象,大家還記得這張

    2024年02月19日
    瀏覽(26)
  • C#調(diào)用C++ dll異常排查

    C#調(diào)用C++ dll異常排查

    最近在做的一款程序,長時間運行總會出現(xiàn)莫名的問題。有時是自動關(guān)閉,有時程序報錯,有時調(diào)用的dll異常…… 由于開始與C++組合作時,使用其提供的dll出現(xiàn)過數(shù)據(jù)讀寫時異常(內(nèi)存操作異常),于是懷疑他們提供的dll有內(nèi)存泄漏。于是想通過日志或其它方法來確認這個猜

    2024年01月21日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包