Tag: reflection

混淆是可能的混淆

自从上一周以来,我一直在努力解决这个问题。 我混淆了我的应用程序的exe。 我们的应用程序是在线Web应用程序的离线工具 客户端将安装此应用程序并连接到Internet,应用程序将下载相关信息并存储在客户端计算机上的xml文件中以供进一步显示。 出于安全考虑,我们正在加密这些xml文件。 不幸的是,我们在exe内部有一个方法GetCryptXML,它将读取客户端机器上的加密settings.xml并在解密后返回它。 此setting.xml也包含其他xml的加密密钥。 我面临的问题是,即使在混淆之后,人也可以通过传递混淆的名称来调用GetCryptXML方法。 有什么方法可以解决这个问题吗? 这是我解决问题的想法,但我不确定如何实施。 我的想法:只有通过使用InvokeMember()函数进行reflection才能调用我的函数。 在可以调用此函数之前,他/她需要使用此函数来加载程序集。 Assembly.LoadFrom(“myapplication.exe”) 如果myapplication.exe中的代码可以识别哪个应用程序试图加载我,那么我们可以限制它们加载,如果它不是应用程序。 我不知道怎么解决。 任何帮助是极大的赞赏。 谢谢。

复制具有不同命名空间的两个相同对象(递归reflection)

我在c#中工作,有几个工作区有一个特定的类,在每个工作区中它总是相同的。 我希望能够拥有此类的副本,以便能够在不处理命名空间差异的情况下使用它。 例子: namespace1 { class class1{ public class2; } class class2{ public string; } } namespace2 { class class1{ public class2; } class class2{ public string; } } 在我复制的类中,我有一个函数将所有数据复制到命名空间的类之一。 如果我只有c#标准类型,它会工作。 一旦我处理class2对象(也来自不同的命名空间),我得到了exeption(“对象与目标类型不匹配。”) public Object toNamespaceClass(Object namespaceClass) { try { Type fromType = this.GetType(); Type toType = namespaceClass.GetType(); PropertyInfo[] fromProps = fromType.GetProperties(); PropertyInfo[] toProps = toType.GetProperties(); […]

如何限制某些assembly的reflection?

在我的.net应用程序中,我想限制对某些程序集的reflection。 我的意思是我想要一个特定的程序集只能通过一些预定义的程序集来反映,而不是通过任何其他程序集。 我怎样才能做到这一点? 编辑: 此工具完全关闭.NET反汇编和程序集的反编译。 我想允许一些预定义的程序集来反映这个程序集,但是限制其他人这样做。 我想要一些应该被声明为汇编的东西,例如,AssemblyOne已经允许你可以反映我的AssemblyTwo,所以只有AssemblyTwo应该能够完全信任它,而不是其他人。

线程可以作为另一个用户执行吗? (.NET 2.0 / 3.5)

我有一个C#应用程序执行一些包含计算到动态程序集的源文件的运行时编译。 显然这是一个严重的安全问题。 从下面的“公式”中,将生成以下代码,并创建一个动态程序集: 式: Int32 _index = value.LastIndexOf(‘.’); String _retVal = value.Substring(_index + 1); return _retVal; 代码生成: using System; namespace Dynamics { public class Evaluator { public Object Evaluate(String value) { // Begin external code Int32 _index = value.LastIndexOf(‘.’); String _retVal = value.Substring(_index + 1); return _retVal; // End external code } } } 然后加载动态assembly,并通过Reflection执行Evaluate方法。 […]

如何找到与导航属性相关的Id属性?

对于我正在使用Entity Framework的项目,我希望能够枚举给定对象实例的所有导航属性(假设它是由EF生成的对象)。 从那里我想获得每个导航属性的相关Id属性。 例如,如果我得到Person类的实例,我希望能够找到它的名为Address and Boss的导航属性。 对于那两个导航属性,我想“查找”名为AddressId和BossId的相关Id属性。 我需要那些Id属性,所以我可以在不同的数据库上运行查询,该数据库没有相同的外键但具有完全相同的ID。 到目前为止,我已经想出了一种方法来获取由EF生成的随机对象实例的RelationshipManager 。 在调试时,我可以通过Manager的Relationships属性获取外键关系。 但我只能获得导航属性名称。 所以我可以看到有一个FK_Person_Address与名为Address的导航属性相关,但我找不到AddressId 。 所以我的问题是,我如何动态地(不知道Person类的布局)发现与Address相关的AddressId属性? 我知道外键关系可能在关系的另一端有Id属性( Boss指向Person而不是Person有BossId )。 在那种情况下,当我正在检查一个Person实例时,我仍然想发现Boss有一个PersonId 。

确定Equals()是否为覆盖?

我有一个Type(type)的实例。 如何确定它是否覆盖Equals()?

AppDomain阴影复制无法正常工作(原始程序集已锁定)

这是我用来探测可用插件列表的一个小类: internal static class PluginDirectoryLoader { public static PluginInfo[] ListPlugins(string path) { var name = Path.GetFileName(path); var setup = new AppDomainSetup { ApplicationBase = path, ShadowCopyFiles = “true” }; var appdomain = AppDomain.CreateDomain(“PluginDirectoryLoader.” + name, null, setup); var exts = (IServerExtensionDiscovery)appdomain.CreateInstanceAndUnwrap(“ServerX.Common”, “ServerX.Common.ServerExtensionDiscovery”); PluginInfo[] plugins = null; try { plugins = exts.ListPlugins(); // <– BREAK HERE […]

如何从未引用的程序集中获取类型?

当类型存在于未引用的程序集中时, GetType()返回null 。 例如,当调用以下内容时,“localType”始终为null(即使使用类的完整命名空间名称): Type localType = Type.GetType(“NamespaceX.ProjectX.ClassX”); 我没有看到任何理由为什么Type.GetType不能从未引用的程序集中检索类型,所以 如何检索未引用的程序集的类型?

C#make class自动注册

我有许多类型,我需要提供与外部世界对话的自定义函数。 例如,我可能有一个Widget和一个Sprocket,当我无法控制的世界数据到达并说“make a Widget”时,我需要调用一个Widget.Create()函数。 如果世界说“制造锤子”,那么我需要返回“锤子不存在”的错误。 但是,world-representation和type-name之间的映射不是1:1,所以我不能简单地使用reflection直接找到类型名称 – 我需要一个表。 (实际上,“名称”可以是例如特定的整数值。) 我理解如何使用从世界表示到类名映射的预定义表(或词典)。 我还了解如何在运行时扩展/更改此表,如果可能的类集更改。 (由于规则更改,或动态加载应用程序的部分,或其他。) 但是,所有这些都需要重复 – 我必须实现我的类,然后,在代码中的其他位置,记得添加“此类在外部世界中具有此名称”的实例。 这有点代码味道,因为将来某个时候我会写一个新类(或删除一个旧类)而忘记更新表,然后花时间调试它为什么不能正常工作。 我以为我可以在每个类中使用一个静态成员,它在全局表中注册自己: public static Registration Me = new Registration(typeid(MyClass), “My Name”); 不幸的是,在执行/访问类中的某个函数之前,不会初始化静态字段,因此这不会在启动时运行。 (静态构造函数具有类似的限制,加上运行时的更多开销!) 接下来的想法是使用自定义属性来装饰类,该属性表示“在表中注册此类”。 [Register(“My Name”)] class MyClass : …. { } 不幸的是,“Register”属性不知道它附加到哪个类 – 只有MyClass类知道它具有Register属性。 (这对我来说是令人生气的,因为如果属性知道他们所附着的地方会很容易,很多很多情况下都是如此。但这是暂时的!) 因此,我能想到的最不好的实现是使用reflection迭代所有程序集的所有类型,并检查它们是否具有此属性,如果是,则在表中注册它们。 我们说,这既不优雅也不高效。 是否有更好的方法来自动注册类而无需使用中央注册表更新其他源文件?

JSON反序列化后无法访问属性到动态

我在JSON反序列化后访问动态属性时遇到了一些问题。 这是JSON: { “user” : { “511221” :{ “timestamp” : 1403365646384, “version” : -81317051, “email” : “user@name.com”, “name” : “My Name”, “structures” : [ “structure.62dd1ff1-f96b-22e3-8d4e-22000c20725r” ] } }, } 这里实际上有两个问题。 首先是每个用户的“511221”更改。 这是在validation时给出的。 我无法创建用户类,然后创建另一个名称不断更改的类。 而且,这是一个数字。 AFAIK,没有办法将类名作为数字。 我有什么选择? 我无法控制API返回的内容。 因此,我没有反序列化到预定义的类中,而是具有动态,如下所示: dynamic jsonObject = JsonConvert.DeserializeObject(response); 我希望能够做到这一点: string[] structures = jsonObject.user.(authInfo.userid).structures; 换句话说,我希望(authInfo.userid)将用户ID作为上面的字符串输入,但这似乎不可能。 我也试过反思: private static object ReflectOnPath(object o, string […]