GVKun编程网logo

c# – System.Reflection vs Generics – 性能(性能好性价比高的手机)

14

本文将带您了解关于c#–System.ReflectionvsGenerics–性能的新内容,同时我们还将为您解释性能好性价比高的手机的相关知识,另外,我们还将为您提供关于.net–什么原因导致Sys

本文将带您了解关于c# – System.Reflection vs Generics – 性能的新内容,同时我们还将为您解释性能好性价比高的手机的相关知识,另外,我们还将为您提供关于.net – 什么原因导致System.BadImageFormatException时构造System.Data.SQLite.SQLiteConnection、.net – 未捕获System.Reflection.TargetInvocationException、asp.net – System.Reflection.Assembly.LoadFile锁定文件、asp.net – 简单LINQ和列表错误:WhereListIterator`1 [任务]’类型’System.Collections.Generic.List`1 [任务]的实用信息。

本文目录一览:

c# – System.Reflection vs Generics – 性能(性能好性价比高的手机)

c# – System.Reflection vs Generics – 性能(性能好性价比高的手机)

我即将在服务器应用程序上编写一组方法,这些方法接收从TCP套接字接收的消息,对它们进行编码/解码,并加密/解密它们.

考虑将消息定义为特殊类型,每个消息都有自己的属性集和总长度,我需要选择以下解决方案之一:
1.制作使用泛型的方法,例如Encode< T>(…),其中T:IMessage然后为每种类型的消息实现编码器/解码器并且具有ResolveEncoder< T>.那将为想要的消息选择编码器
要么
2.创建使用任何类型的消息的方法,只要它实现IMessage,例如Encode(IMessage消息),并使用System.Reflection来确定我需要了解的所有内容.

我对解决方案#2更感兴趣,因为它使我的代码缩小了30倍.但是,我担心不断反映属性是否会影响性能.现在由于时间限制完成项目,我无法真正“实验”.

我将非常感谢任何个人经验或与基准测试相关的性能与任何一种解决方案的关系.

解决方法

反思可以足够快.但需要正确实施.

反思表现 –

快速和轻便的功能

typeof
Object.GetType
typeof == Object.GetType
Type equivalence APIs (including typehandle operator overloads)
get_Module
get_MemberType
Some of the IsXX predicate APIs
New token/handle resolution APIs in the .NET Framework 2.0

昂贵的功能

GetXX  APIs (MethodInfo,PropertyInfo,FieldInfo,and so on)
GetCustomAttributes
Type.InvokeMember
Invoke APIs (MethodInfo.Invoke,FieldInfo.GetValue,and so on)
get_Name (Name property)
Activator.CreateInstance

Source – Dodge Common Performance Pitfalls to Craft Speedy Applications

MethodInfo可以加速 – Improving performance reflection,what alternatives should I consider

好的链接:
How costly is .NET reflection?
http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces

.net – 什么原因导致System.BadImageFormatException时构造System.Data.SQLite.SQLiteConnection

.net – 什么原因导致System.BadImageFormatException时构造System.Data.SQLite.SQLiteConnection

我已经破碎代码到尽可能小的语句:
Dim cn As System.Data.sqlite.sqliteConnection

当从WinForm应用程序调用代码时,我得到以下错误:

System.BadImageFormatException: Could
not load file or assembly
‘System.Data.sqlite,Version=1.0.65.0,
Culture=neutral,
PublicKeyToken=db937bc2d44ff139’ or
one of its dependencies. An attempt
was made to load a program with an
incorrect format. File name:
‘System.Data.sqlite,
PublicKeyToken=db937bc2d44ff139’

然而从MS单元测试I调用同一段代码没有得到错误,加上完整的代码集工作原理。

sqlLite包含非托管代码,您不能在64位操作系统上运行它,除非部署64位版本。快速修复:项目属性,构建选项卡,平台目标= x86。

.net – 未捕获System.Reflection.TargetInvocationException

.net – 未捕获System.Reflection.TargetInvocationException

解决方案后添加的注意事项:反射调用的方法中抛出了AccessViolationException.这就是无法捕获TargetInvocationException的原因.

注意:这是IDE的外部. The referenced question is NOT the same.

TL; DR

>无法获得堆栈跟踪
>无法获得内部异常
>不能使用调试器(第三方库的复制保护方案妨碍)
>对代码的任何更改都会阻止异常发生 – 意味着我无法添加日志记录以找出发生异常的位置

如何通过其他方式获取异常或获取所需信息?

详细描述:

我遇到的问题是在一个被反射调用的方法中发生的异常.异常本身实际上发生在被调用的方法中,但由于该方法是通过反射调用的,因此真正的异常包含在System.Reflection.TargetInvocationException中.没问题,只需捕获它并获取内部异常 – 除了System.Reflection.TargetInvocationException没有被捕获.我的程序崩溃,我得到一个转储以及Windows事件日志中的条目.

Windows事件日志不包含内部异常,也不包含转储.
我无法将调试器附加到程序中,因为外部库(需要进入反射调用)将无法运行 – 复制保护,您知道吗?
如果我将一个try / catch放入有问题的方法中,则不会发生异常 – 这很糟糕.原因并不固定,只是不再发生.
如果我将登录放入有问题的方法,则会发生同样的效果 – 不再发生异常.

我不能使用日志记录,我不能使用调试器,并且在我可以捕获异常并记录它的一个地方,异常不会被捕获.

我正在使用Visual Studio 2010和dotnet 4.0.

为了说清楚:当程序在Visual Studio之外运行时,try / catch不起作用,我无法在调试器中的Visual Studio内运行它,因为那时程序无法到达异常点发生.这不在IDE中.

消除反射不是一种选择(我只针对一种情况尝试过,异常就消失了.)

被调用的方法做了很多事情,但是把它分解成更小的方法并没有帮助 – 例外就消失了.

异常不会一直发生,只有当我执行某一系列步骤时 – 并且当它发生时,它总是在整个序列中第二次发生.

在我使用的序列中,该方法几乎同时由两个线程调用 – 输入一组特定的数据,这会导致报告的副本和另一个文档打印在两个单独的打印机上 – 每个打印机一个报告和文档.由于生成报告和打印文档可能需要一段时间,因此它们在后台的线程上完成,因此用户可以继续工作.

我怀疑线程正在踩着彼此的脚趾(正在进行大量的文件和数据库操作),但不知道实际发生了什么,我无法解决它.

下面的代码显示了通过反射调用的简化版本.

是否有人建议可能导致System.Reflection.TargetInvocationException未被捕获,或者可能是另一种捕获内部异常的方法?

Try
    Dim methode As System.Reflection.MethodInfo
    methode = GetType(AParticularClass).getmethod("OneOfManyMethods",Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)
    Dim resultobject As Object = methode.Invoke(nothing,Reflection.BindingFlags.InvokeMethod Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static,nothing,New Object() {SomeBooleanVariable,SomeStringVariable},nothing)
    result = DirectCast(resultobject,DataSet)
Catch ex As Exception
    'Log the error here.
End Try
找到我无法捕获异常的原因:

实际的异常是AccessViolationException,如果不采取特殊步骤(How to handle AccessViolationException.),则无法在dotnet 4.0中捕获

为了使事情变得更有趣,当在反射调用的方法中抛出AccessViolationException时,只会在Windows事件日志中记录TargetInvocationException,并且转储中只有TargetInvocationException可用.

一旦我设法获得真正的异常,我发现它是从导致AccessViolation的非GUI线程调用Application.DoEvents().在GUI-Thread(Use of Application.DoEvents())上调用时,DoEvents()可以带来足够的乐趣,更不用说从后台线程调用了.

一旦修复,我发现我们的第三方库(具有复制保护的库)不喜欢在不同的实例中同时调用.修复这是一个在正确的地方合并的问题.

导致所有这些乐趣的代码一次都在GUI-Thread中,并且最初是在dotnet 1.1的时代写回来的 – 这解释了对DoEvents的调用.代码已逐段转换为在后台线程中并行运行几个不同的阶段,没有一个开发人员对该过程有完整的概述.

asp.net – System.Reflection.Assembly.LoadFile锁定文件

asp.net – System.Reflection.Assembly.LoadFile锁定文件

我通过System.Reflection.Assembly.LoadFile加载一个DLL,并在一个插件式系统中反映它的成员。
我需要能够更新/覆盖这些DLL,而系统正在运行,但似乎在调用System.Reflection.Assembly.LoadFile后,该文件随后被锁定。
有谁知道一个方法来解锁文件?
我已经阅读关于在单独的应用程序域中加载文件?这种方法有什么缺陷吗?

解决方法

如果你使用这个:
System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path))

它不会锁定该文件。

编辑

虽然这是工作,但它不是最好的解决方案,但更好的方式是更多的参与(太多的只是粘贴所有的代码在这里)。

我在Github上创建了一个公共存储库,其中包含所有正确执行此操作的代码:

Loading Assemblies without Locking by using Shadow Copying.

asp.net – 简单LINQ和列表错误:WhereListIterator`1 [任务]’类型’System.Collections.Generic.List`1 [任务]

asp.net – 简单LINQ和列表错误:WhereListIterator`1 [任务]’类型’System.Collections.Generic.List`1 [任务]

我无法理解我的错误

方法:

public List<Task> GetAllTasks()
{
    var AllTasks = from t in tasks
                   where t.Status.ToString() == "Completed" || t.Status.ToString() == "Pending"
                   select t;

    return (List<Task>)AllTasks;
}

代码背后:

protected void Page_Load(object sender,EventArgs e)
{
    TaskList tdl = (TaskList)Session["TodoList"];
    List<Task> AllTasks = tdl.GetAllTasks();
    string str = "";

    foreach (Task t in AllTasks)
    {
        str += t.ToString() + "<br />";
    }

    LblTasks.Text = str;

}

添加任务(AddTask.aspx)后,我重定向到另一个页面来显示它们,然后我得到运行时错误:

无法强制类型为“WhereListIterator1 [Task]”的对象键入“System.Collections.Generic.List1 [Task]”。

我的LINQ有什么问题吗?我刚刚学了昨天hehe。

谢谢。

解决方法

你只需要一个.ToList()直接对查询或当你返回它。作为
var AllTasks = (from t in tasks
               where t.Status.ToString() == "Completed" || t.Status.ToString() == "Pending"
               select t).ToList();

要么

return AllTasks.ToList();

关于c# – System.Reflection vs Generics – 性能性能好性价比高的手机的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.net – 什么原因导致System.BadImageFormatException时构造System.Data.SQLite.SQLiteConnection、.net – 未捕获System.Reflection.TargetInvocationException、asp.net – System.Reflection.Assembly.LoadFile锁定文件、asp.net – 简单LINQ和列表错误:WhereListIterator`1 [任务]’类型’System.Collections.Generic.List`1 [任务]的相关知识,请在本站寻找。

本文标签: