C 反射與編譯

2022-04-29 13:21:10 字數 2867 閱讀 7030

首先了解下,如何區分編譯生成的 .dll的版本

方法1:ilspy反編譯工具

通過 assembly屬性,release版本沒有或僅有如下一種屬性

[assembly: debuggable(debuggableattribute.debuggingmodes.ignoresymbolstoresequencepoints)]

而 debug版本,屬性較多,示例

[assembly: debuggable(debuggableattribute.debuggingmodes.default | debuggableattribute.debuggingmodes.disableoptimizations | 

debuggableattribute.debuggingmodes.ignoresymbolstoresequencepoints | debuggableattribute.debuggingmodes.enableeditandcontinue)]

具體參見:

方法2:**檢測

public static class utils

public enum dllmode ;

public static dllmode checkdllmode_1(string _filepath)

else

} else

}public static dllmode checkdllmode_2(string _filepath)

}

具體參見:

解決方法,在當前.cs中新增

namespace system.runtime.compilerservices 

}

類assembly中load, loadfrom, loadfile方法比較

下面給出2種程式集載入方法

//方法1:直接從dll路徑載入 ok

assembly = assembly.loadfrom(assemblypath);

//方法2:先把dll載入到記憶體,再從記憶體中載入 ok

using (filestream fs = new filestream(assemblypath, filemode.open, fileaccess.read))

}

可以將程式集中定義的所有型別暫存備用,呼叫時指定程式集和方法名即可

// httypes是hashtable

foreach (type tp in assembly.gettypes())

string classname = "calculator.calculator"; //程式集.類名

string funname = "add"; //方法名

if (typetest.httypes.containskey(classname))

); }

}

對於設定或獲取欄位或屬性的值,注意區分靜態/非靜態

非靜態的例項欄位或屬性,getvalue和setvalue時,第乙個引數務必傳入例項物件

object obj = activator.createinstance(type, true);

而靜態的,直接送null即可。設定時,保險起見可以作型別轉換

var v = convert.changetype(value, tp.getfield/getproperty(_name).fieldtype/propertytype);

注,待載入的程式集可以在配置檔案中配置。

**中動態載入即可

namevaluecollection assemblylist = configurationmanager.getsection("assembly") as namevaluecollection;

.net框架提供了乙個綜合性方法:type.invokemember,但是引數較多,慎用。

應用[1]. 獲取當前執行的方法的資訊:2種

methodbase method = methodbase.getcurrentmethod();

string tag = method.reflectedtype.fullname + "." + method.name; //類名.方法名

stacktrace stacktrace = new stacktrace(true);

methodbase method = stacktrace.getframe(0).getmethod();

string codedestination = method.declaringtype.name + "-" + method.name; //類名.方法名

若要獲取父方法的資訊,使用 getframe(1) 即可。

[2]. 提取類例項欄位名和字段值

public static string getallkeyvalue(t t, idictionarydic, bool removeemptyval) 

try

foreach (system.reflection.propertyinfo item in properties)

else

} else

else //getallkeyvalue(value, dic, removeemptyval);}}

} catch (exception ex)

return string.empty;

}

其中getproperties()中的引數可以按需控制。

c so 反射 C 反射的方法與實現

1.什麼是反射?反射是程式獲取自身資訊的能力 2.反射有什麼用?可以用於動態建立型別,跨語言跨平台資料互動,持久化,序列化等等。3.反射包含哪些功能?至少包含以下功能 列舉所有member 獲取member的name和type 能夠get set member 4.有哪些反射方法?反射主要有3種實現...

對映與反射

對映 由類生成物件 物件.set屬性 值 物件.方法 反射由物件得到類 由屬性呼叫物件 field.set 物件,值 由方法呼叫物件 method.invoke 物件,引數 獲取類的方法 class c1 型別.class 根據類名獲取類 class c2 物件.getclass 根據物件獲取類 c...

反射與特性

反射 程式在執行時,可以檢視其它程式集或其本身的元資料。乙個執行的程式檢視本身的元資料或者其他程式集的元資料的行為叫做反射。myclass.cs class myclass 定義乙個用來反射查詢的元資料 public void test program.cs static void main str...