swfupload

flash格式的http上传控件

 

smartftp

http://www.smartftp.com/ftplib/

ftp上传的activex控件

 

http://www.ncmem.com

国产的ftp控件和http控件

 

找找看有没有基于silverlight或flash的同时支持http上传和ftp上传的控件,同时ftp上传还带续传功能

posted @ 2010-12-15 11:15 pk3000lc 阅读(35) 评论(0) 编辑

转自:http://blog.csdn.net/leonpard/archive/2005/01/31/274837.aspx

最近因为要做一个视频点播系统,普通的WEB上传没有办法实现300M以上的这么大的传输数据量,想了很久,考虑还是用FTP来传比较好!!!
思路:
一 WEB部分  
   1  首先把WEB页获得本地要上传的文件名
   2  WEB通过脚本把本地文件名(绝对路径)给客户端组件
   3  WEB脚本控制组件开始传送数据
   4  最后判断是否传输成功
二 组件部分
   1  建立INTERNET连接
   2  连接FTP服务器
   3  获得本地文件名(绝对路径)
   4  返回远程即将保存的文件名
   5  传送数据
   6  判断是否传输成功,返回状态

WEB页获取本地文件

组件返回远程文件名

组件传送数据

返回

本例在VB6.0 +WIN2000+ IIS5.0 + SERV-U 5.0 下调试成功
VB部分
一、建立一个ActiveX DLL工程
二、更改工程名FtpConn
三、更改类名:clsPutFile
四、加入一个空模块到工程中,此模块主要对需要使用的函数进行声明,在此不多做解释,代码如下:
Option Explicit

Declare Function GetProcessHeap Lib "kernel32" () As Long
Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Public Const HEAP_ZERO_MEMORY = &H8
Public Const HEAP_GENERATE_EXCEPTIONS = &H4

Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" ( _
         hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Declare Sub CopyMemory2 Lib "kernel32" Alias "RtlMoveMemory" ( _
         hpvDest As Long, hpvSource As Any, ByVal cbCopy As Long)

Public Const MAX_PATH = 260
Public Const NO_ERROR = 0
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
Public Const FILE_ATTRIBUTE_OFFLINE = &H1000

Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type

Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
End Type

Public Const ERROR_NO_MORE_FILES = 18

Public Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _
    (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long
Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
(ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _
      lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long

Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _
(ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _
      ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, _
      ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

Public Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _
(ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _
      ByVal lpszRemoteFile As String, _
      ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" _
    (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
' Initializes an application's use of the Win32 Internet functions
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

' User agent constant.
Public Const scUserAgent = "vb wininet"

' Use registry access settings.
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_OPEN_TYPE_PROXY = 3
Public Const INTERNET_INVALID_PORT_NUMBER = 0

Public Const FTP_TRANSFER_TYPE_ASCII = &H1
Public Const FTP_TRANSFER_TYPE_BINARY = &H1
Public Const INTERNET_FLAG_PASSIVE = &H8000000

' Opens a HTTP session for a given site.
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _
(ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, _
ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Const ERROR_INTERNET_EXTENDED_ERROR = 12003
Public Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" ( _
    lpdwError As Long, _
    ByVal lpszBuffer As String, _
    lpdwBufferLength As Long) As Boolean

' Number of the TCP/IP port on the server to connect to.
Public Const INTERNET_DEFAULT_FTP_PORT = 21
Public Const INTERNET_DEFAULT_GOPHER_PORT = 70
Public Const INTERNET_DEFAULT_HTTP_PORT = 80
Public Const INTERNET_DEFAULT_HTTPS_PORT = 443
Public Const INTERNET_DEFAULT_SOCKS_PORT = 1080

Public Const INTERNET_OPTION_CONNECT_TIMEOUT = 2
Public Const INTERNET_OPTION_RECEIVE_TIMEOUT = 6
Public Const INTERNET_OPTION_SEND_TIMEOUT = 5

Public Const INTERNET_OPTION_USERNAME = 28
Public Const INTERNET_OPTION_PASSWORD = 29
Public Const INTERNET_OPTION_PROXY_USERNAME = 43
Public Const INTERNET_OPTION_PROXY_PASSWORD = 44

' Type of service to access.
Public Const INTERNET_SERVICE_FTP = 1
Public Const INTERNET_SERVICE_GOPHER = 2
Public Const INTERNET_SERVICE_HTTP = 3

' Opens an HTTP request handle.
Public Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" _
(ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, _
ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

' Brings the data across the wire even if it locally cached.
Public Const INTERNET_FLAG_RELOAD = &H80000000
Public Const INTERNET_FLAG_KEEP_CONNECTION = &H400000
Public Const INTERNET_FLAG_MULTIPART = &H200000

Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000

' Sends the specified request to the HTTP server.
Public Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal _
hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As _
String, ByVal lOptionalLength As Long) As Integer

' Queries for information about an HTTP request.
Public Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" _
(ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, _
ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer

' The possible values for the lInfoLevel parameter include:
Public Const HTTP_QUERY_CONTENT_TYPE = 1
Public Const HTTP_QUERY_CONTENT_LENGTH = 5
Public Const HTTP_QUERY_EXPIRES = 10
Public Const HTTP_QUERY_LAST_MODIFIED = 11
Public Const HTTP_QUERY_PRAGMA = 17
Public Const HTTP_QUERY_VERSION = 18
Public Const HTTP_QUERY_STATUS_CODE = 19
Public Const HTTP_QUERY_STATUS_TEXT = 20
Public Const HTTP_QUERY_RAW_HEADERS = 21
Public Const HTTP_QUERY_RAW_HEADERS_CRLF = 22
Public Const HTTP_QUERY_FORWARDED = 30
Public Const HTTP_QUERY_SERVER = 37
Public Const HTTP_QUERY_USER_AGENT = 39
Public Const HTTP_QUERY_SET_COOKIE = 43
Public Const HTTP_QUERY_REQUEST_METHOD = 45
Public Const HTTP_STATUS_DENIED = 401
Public Const HTTP_STATUS_PROXY_AUTH_REQ = 407

' Add this flag to the about flags to get request header.
Public Const HTTP_QUERY_FLAG_REQUEST_HEADERS = &H80000000
Public Const HTTP_QUERY_FLAG_NUMBER = &H20000000
' Reads data from a handle opened by the HttpOpenRequest function.
Public Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer

Public Declare Function InternetWriteFile Lib "wininet.dll" _
        (ByVal hFile As Long, ByVal sBuffer As String, _
        ByVal lNumberOfBytesToRead As Long, _
        lNumberOfBytesRead As Long) As Integer

Public Declare Function FtpOpenFile Lib "wininet.dll" Alias _
        "FtpOpenFileA" (ByVal hFtpSession As Long, _
        ByVal sFileName As String, ByVal lAccess As Long, _
        ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function FtpDeleteFile Lib "wininet.dll" _
    Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, _
    ByVal lpszFileName As String) As Boolean
Public Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" _
(ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByVal lBufferLength As Long) As Integer
Public Declare Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" _
(ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer

' Closes a single Internet handle or a subtree of Internet handles.
Public Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer

' Queries an Internet option on the specified handle
Public Declare Function InternetQueryOption Lib "wininet.dll" Alias "InternetQueryOptionA" _
(ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long) As Integer

' Returns the version number of Wininet.dll.
Public Const INTERNET_OPTION_VERSION = 40

' Contains the version number of the DLL that contains the Windows Internet
' functions (Wininet.dll). This structure is used when passing the
' INTERNET_OPTION_VERSION flag to the InternetQueryOption function.
Public Type tWinInetDLLVersion
    lMajorVersion As Long
    lMinorVersion As Long
End Type

' Adds one or more HTTP request headers to the HTTP request handle.
Public Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" _
(ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, _
ByVal lModifiers As Long) As Integer

' Flags to modify the semantics of this function. Can be a combination of these values:

' Adds the header only if it does not already exist; otherwise, an error is returned.
Public Const HTTP_ADDREQ_FLAG_ADD_IF_NEW = &H10000000

' Adds the header if it does not exist. Used with REPLACE.
Public Const HTTP_ADDREQ_FLAG_ADD = &H20000000

' Replaces or removes a header. If the header value is empty and the header is found,
' it is removed. If not empty, the header value is replaced
Public Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000

五、输入类代码,代码如下:
Option Explicit
Dim bActiveSession As Boolean
Dim hOpen As Long
Dim hConnection As Long
Dim scUserAgent As String
Dim strServer As String
Dim strUser As String
Dim strPassword As String
Dim nFlag As Long
Dim bRet As Boolean
Dim szFileLocal As String
Dim szFileRemote As String
Dim dwType As Integer

Public Function PUTFILE() As Boolean
On Error Resume Next
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
hConnection = InternetConnect(hOpen, strServer, INTERNET_INVALID_PORT_NUMBER, strUser, strPassword, INTERNET_SERVICE_FTP, nFlag, 0)
bRet = FtpPutFile(hConnection, szFileLocal, szFileRemote, _
         dwType, 0)
Call CloseConn
PUTFILE = bRet
End Function

Sub CloseConn()
    If hConnection <> 0 Then InternetCloseHandle hConnection
    hConnection = 0
End Sub

Function getRemoteName(filename)
    Dim arrName() As String
    arrName = Split(filename, ".")
    Randomize
    getRemoteName = Date & CInt(Rnd * 1000) & "." & arrName(UBound(arrName))
End Function

Private Sub Class_Initialize()
    scUserAgent = "My FTP"
    strServer = "www.XXX.cn"
    strUser = "Username"
    strPassword = "Password"
    nFlag = INTERNET_FLAG_PASSIVE
    szFileLocal = "DefultLocalFileName"
    szFileRemote = "DefultRemoteFileName"
    dwType = 1
End Sub

Public Property Get connServer() As Variant
    connServer = strServer
End Property

Public Property Let connServer(ByVal vNewValue As Variant)
    strServer = vNewValue
End Property

Public Property Get connUser() As Variant
    connUser = strUser
End Property

Public Property Let connUser(ByVal vNewValue As Variant)
    strUser = vNewValue
End Property

Public Property Get connPassword() As Variant
    connPassword = strPassword
End Property

Public Property Let connPassword(ByVal vNewValue As Variant)
    strPassword = vNewValue
End Property

Public Property Let LocalFileName(ByVal vNewValue As Variant)
    szFileLocal = vNewValue
    szFileRemote = getRemoteName(vNewValue)
End Property

Public Property Get RemoteFileName() As Variant
    RemoteFileName = szFileRemote
End Property

六、生成DLL
七、使用VB6的打包工具打包成“Internet ActiveX 安装包”,这是,VB打包后,还会给一个例子的HTML文件
八、建立HTML文件
<HTML>
<HEAD>
<TITLE>FtpConn.CAB</TITLE>
</HEAD>
<BODY>
<OBJECT ID="clsPutFile"
CLASSID="CLSID:D9BACC8F-0A99-46DA-ADA3-F1C25A48AA78"
CODEBASE="FtpConn.CAB#version=1,0,0,0">
</OBJECT>
<INPUT type="file" name="FileName"><button onclick="go()">GO~!</button>
<SCRIPT LANGUAGE="JavaScript">
<!-- by Newrocky 2004-12-7  QQ:1936234 
function go()
{
if (FileName.value!='')
{
  clsPutFile.LocalFileName=FileName.value;
  alert(clsPutFile.RemoteFileName);//查看远程文件名
  if (clsPutFile.PutFile())                //开始传送文件,如果返回true则成功,反之失败
  {
   alert('上传文件成功!');
  }
  else
  {
   alert('上传文件失败!')
  }
}
else
{
alert('请选择您要上传的文件');
}
}
//-->
</SCRIPT>
</BODY>
</HTML>

ok~!

posted @ 2010-12-15 11:04 pk3000lc 阅读(71) 评论(0) 编辑

翻译出处:http://www.codeproject.com/KB/aspnet/aspnetPerformance.aspx



1. HTTP 压缩

HTTP 压缩通常用于压缩从服务端返回的页面内容。它压缩HTTP请求和响应,这个会是巨大的性能提升。我的项目是基于Window Server 2003开发的,可以参考这篇文章.



2. 让ViewState失效

ViewState允许页面状态保持在客户端,它不区别于Cookie或者服务器内存。View State保存数据在一个隐藏域中。可以肯定的是,这个是很很强大的特性,但它的缺点使页面大小和在服务器中的内存增大。

所以,我们要避免使用ViewState,特别是,DataGrid等控件,ViewState加载所有的表格数据的状态。去掉它,可以使页面的大小缩小。



3. 改变Web.config文件

a. 用页面缓存:

这将在一定的时间段保存你的页面,页面能够更快得地加载出来。但要记住,如果你的页面数据经常更新,就不适合使用页面缓存。

<caching> <outputCacheSettings> <outputCacheProfiles> <add name="cached" duration="600" varyByParam="none" enabled="true"/> </outputCacheProfiles> </outputCacheSettings> </caching>

b. 从web.config移除不必要的httpModule:

<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <remove name="WindowsAuthentication" /> <remove name="PassportAuthentication" /> <remove name="AnonymousIdentification" /> <remove name="UrlAuthorization" /> <remove name="FileAuthorization" />

c. 关闭跟踪:

<trace enabled="false" pageOutput="false" />

d. 当使用user membership的时候,使profiles保存自动失效:

<profile enabled="true" automaticSaveEnabled="false" />

e. 设置调试状态为false:

<compilation debug="false">



4. 提高Cache Dependency:

三种方式的cache dependencies可以使用:

1. 在传统缓存项的caching dependencies;

2. 在文件上的caching dependencies;

3. 在SQL上的caching dependecies;

你应该选择最好的策略适应你的应用程序,这儿有一个在文件上cache dependency的例子可以参考下。



5. 优化CSS样式表:

清理CSS样式表是非常重要的,移除没用的代码能够提升页面加载的效率,在工程中,可以使用工具来压缩样式表的大小,可以使用CSS在线压缩工具来压缩css代码的大小。



6. 优化Javascript代码:

可以使用JS在线压缩工具来优化Javascript代码。



7. JS和CSS文件的位置:

将CSS文件尽量放在页面的头部,将JS文件尽量放在页面的底部。


8. 如果可能,将server.transfer()代替response.redirect()

这样将更快地加载页面,因为它只是在Post表单,而不用刷新整个页面。


9. 在验证方面,使用客户端脚本:

可以避免postback回传。

 

 

作者:Leepy
    
 
我的作品:全国团购导航大全(http://www.baotuan365.com/)
    
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2010-11-30 23:02 pk3000lc 阅读(131) 评论(0) 编辑

.NET反射的定义:审查元数据并收集关于它的类型信息的能力。

元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述。将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中。

而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中。在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。

当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。

元数据以非特定语言的方式描述在代码中定义的每一类型和成员。元数据存储以下信息:

程序集的说明:

1.    标识(名称、版本、区域性、公钥)。

2.    导出的类型。

3.    该程序集所依赖的其他程序集。

4.    运行所需的安全权限。

类型的说明:

1.    名称、可见性、基类和实现的接口。

2.    成员(方法、字段、属性、事件、嵌套的类型)。

属性:

1.    修饰类型和成员的其他说明性元素。

System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码和反射相关的命名空间(我们就是通过这几个命名空间访问反射信息):

System.Reflection.MemberInfo

System.Reflection.EventInfo

System.Reflection.FieldInfo

System.Reflection.MethodBase

System.Reflection.ConstructorInfo

System.Reflection.MethodInfo

System.Reflection.PropertyInfo

System.Type System.Reflection.Assembly

.NET反射的作用:

1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型。

2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。

3. 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

应用要点:

1.在.net实现工厂模式的时候好多都会用到反射。而工厂模式用的很多。

2. 使用反射动态绑定需要牺牲性能。

3. 有些元数据信息是不能通过反射获取的。

4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。

反射单个程序集

1.    Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上。

先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常。

2. LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。

3. LoadWithPartialName:永远不要使用这个方法,因为应用程序不能确定再在载入的程序集的版本。该方法的唯一用途是帮助那些在.Net框架的测试环节使用.net 框架提供的某种行为的客户,这个方法将最终被抛弃不用。

反射的层次模型

.NET反射的概述:

应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域。

这些域在拥有相同应用程序范围的对象周围形成了确定边界。

这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。

程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。

我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途:

(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。

(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。

使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。

(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。

使用Type的GetMethods或GetMethod方法来调用特定的方法。

(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。

(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。

(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

System.Reflection.Emit命名空间的类提供了一种特殊形式的反射,可以在运行时构造类型。

反射也可用于创建称为类型浏览器的应用程序,使用户能够选择类型,然后查看有关选定类型的信息。

此外,Jscript等语言编译器使用反射来构造符号表。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段,System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。

反射的性能:

使用反射来调用类型或者触发方法,或者访问一个字段或者属性时clr 需 要做更多的工作:校验参数,检查权限等等,所以速度是非常慢的。

所以尽量不要使用反射进行编程,对于打算编写一个动态构造类型(晚绑定)的应用程序,可以采取以下的几种方式进行代替:

1、通过类的继承关系。让该类型从一个编译时可知的基础类型派生出来,在运行时生成该类 型的一个实例,将对其的引用放到其基础类型的一个变量中,然后调用该基础类型的虚方法。

2、通过接口实现。在运行时,构建该类型的一个实例,将对其的引用放到其接口类型的一个变量中,然后调用该接口定义的虚方法。

3、通过委托实现。让该类型实现一个方法,其名称和原型都与一个在编译时就已知的委托相符。

在运行时先构造该类型的实例,然后在用该方法的对象及名称构造出该委托的实例,接着通过委托调用你想要的方法。这个方法相对与前面两个方法所作的工作要多一些,效率更低一些。

提高反射的性能:反射的性能损失主要来源于比较类型、遍历成员、调用成员三种情形,其中比较类型耗时最小。

调用成员耗时最多,所以尽量减少采用成员动态调用等反射方式可以提高应用程序性能。除此之外,采取后期绑定、避免将反射方法放到循环内产生放大效应等办法均可提升反射性能。

示例如下:这是一个Calculator.dll

下面是通过反射检查和调用Calculator.dll中的的方法:

下面是运行出来的效果:

posted @ 2010-11-28 16:18 pk3000lc 阅读(1206) 评论(1) 编辑

在配置管理和测试管理分工明确的公司,偶尔会拿到一个测试版本,测试时这也问题那也问题,经常性的崩溃。这时,您可能需要考虑是否版本缺少文件的可能性了。有什么办法能够理直气壮的对配置人员或者开发人员说,你给的版本少文件,并且少哪个文件呢?那这里小罗告诉你答案。

   .net程序是由程序集组成,程序集分为公有程序集和私有程序集,公有程序集一般需要在C:\WINDOWS\assembly中进行强命名注册,私有程序集一般会放在可执行exe相同的路径下面、或者是可执行exe程序的config文件中的路径位置。(有关.net基本知识请参考相关文档,你只需要知道这么多就可以测试了)。

具体步骤:

1,在vs2005中新建一个工程,如testtools,项目类型选择windows应用程序。

2,在windows form上面拖入一个文件浏览的botton,和一个文本框,然后在botton的事件上面录入如下代码:

/// <summary>
        /// 浏览按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.Filter="可执行文件|*.exe";
            this.openFileDialog1.ShowDialog();
            this.textBox1.Text = this.openFileDialog1.FileName.Trim();
            if (this.textBox1.Text.Trim() == string.Empty)
            {
                MessageBox.Show("选择文件,文件类型为dll或者exe", "数慧测试平台");
                return;

            }
           return;

        }

3,在windows form上面拖入普通的botton,然后在botton的事件上面录入如下代码:

       /// <summary>
        /// 获取引用列表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (this.textBox1.Text.Trim() == string.Empty)
            {
                MessageBox.Show("请先选择文件", "数慧测试平台");
                return;
            }

            if (this.radioButton1.Checked == true)
            {
             //这里将程序引用信息写入到txt中,读者可以自定义。
                TestLogManager testlog = new TestLogManager();
                StreamWriter swriter = testlog.getStreamwriter(Application.StartupPath + "\\安装测试\\" + "程序引用日志.txt");
                swriter.WriteLine("引用dll名称\t" + "版本\t" + "公钥");
                IList<string> pList = new List<string>();
                ArrayList pList2 = new ArrayList();
                try
                {
                    Assembly asscembly = Assembly.LoadFile(this.textBox1.Text.Trim());//装载程序集
                    GetAssemblysRecurse(asscembly, pList, pList2);
                    //对输出结果进行排序
                    pList2.Sort(new myReverserClass());

                    foreach (AssemblyName pAssemblyNameReferenced in pList2)
                    {

                        // 获得程序引用的名称
                        swriter.WriteLine("" + pAssemblyNameReferenced.Name + "\t" + pAssemblyNameReferenced.Version + "\t" + pAssemblyNameReferenced.KeyPair);

                    }
                }
                finally
                {
                    swriter.Close();
                }
                MessageBox.Show("完成!" + "请查看:" + Application.StartupPath + "\\安装测试\\程序引用日志.txt", "数慧测试平台");
                return;

            }
            else
            {
                return;
            }

        }
        /// <summary>
        /// 排序方法
        /// </summary>
        public class myReverserClass : IComparer
        {
            int IComparer.Compare(object x, object y)
            {
                return (x as AssemblyName).Name.CompareTo((y as AssemblyName).Name);
            }
        }

        /// <summary>
        /// 递归函数,递归获得程序集合名称,然后写入日志中。
        /// </summary>
        /// <param name="swriter"></param>
        /// <param name="asscembly"></param>
        /// <param name="pList"></param>
        private void GetAssemblysRecurse(Assembly asscembly, IList<string> pList, ArrayList pList2)
        {
            AssemblyName[] assemblyname = asscembly.GetReferencedAssemblies();//获得引用程序集
            foreach (AssemblyName pAssemblyNameReferenced in assemblyname)
            {
                Assembly pAssemblyReferenced = null;
                //先从公共的Assembly中检查是否存在相应的dll,如:C:\WINDOWS\assembly
                try
                {
                    pAssemblyReferenced = Assembly.Load(pAssemblyNameReferenced);
                }
                catch (Exception)
                {
                }
                //从可执行的exe下面检查是否存在相应的dll
                if (pAssemblyReferenced == null)
                {
                    try
                    {
                        pAssemblyReferenced = Assembly.LoadFile(Path.GetDirectoryName(this.textBox1.Text.Trim()) +
                            Path.DirectorySeparatorChar + pAssemblyNameReferenced.Name + ".dll");
                    }
                    catch (Exception)
                    {

                    }
                }
                //如果存在引用的dll,然后判断是否为系统的dll。
                if (pAssemblyReferenced != null)
                {
                    if (pAssemblyNameReferenced.Name.IndexOf("Test_ms") > -1 ||
                        pAssemblyNameReferenced.Name.IndexOf("Test_System") > -1||
                        pAssemblyNameReferenced.Name.IndexOf("test_office") > -1||
                        pAssemblyNameReferenced.Name.IndexOf("test_Interop") > -1)
                    {
                        continue;
                    }

                    //如果plist中不存在,则添加。
                    if (pList.IndexOf(pAssemblyNameReferenced.Name) == -1)
                    {
                        pList.Add(pAssemblyNameReferenced.Name);                                    
                       //将程序集添加到plist2中,plist2主要是用来排序。
                        pList2.Add(pAssemblyNameReferenced);
                        //执行递归方法
                        GetAssemblysRecurse(pAssemblyReferenced, pList, pList2);
                    }
                }

            }
        }

4,编译工程,然后执行exe即可获得引用的程序集列表。

posted @ 2010-11-28 16:13 pk3000lc 阅读(193) 评论(0) 编辑
来源:http://qdknow.com/Html/Article/View/2/188.html

 

在.NET中,不调用C++/CLI,进行字符串替换有好几种方法:

1、最常用的,就是String实例.Replace(),但这个不能忽略大小写。

2、System.Text.Regex(Regular Expression正则表达式),大家都估计到它的效率不高,虽然它支持忽略大小写。

3、String.SubString()循环,查找要替换的子字符串的位置,截取,然后字符串相加,大家也估计到,数量少(在codeproject.com上曾有文章讨论过和StringBuilder的临届值是600次)的情况下会比StringBuilder快。

4、跟3一样,唯一区别就是字符累加用StringBuilder,数量少的情况下比字符累加要慢,但过了临届值就要快。

5、引用Microsoft VisualBasic RunTime(Microsoft.VisualBasic.DLL),里面有一个Strings.Replace,效率非常高,其原理就是:Split()再Join(),其中Split支持忽略大小写的秘诀就是调用了System.Globalization.CultureInfo,也就是所谓的国际化,其实要实现字符串的替换代码量不多,但要兼容各种语言(非编程语言,是交流语言),那就得多花几倍的代码了。

6、不想用VB运行库的朋友,可以用Reflector配合Denis Bauer's Reflector.FileDisassembler把Microsoft.VisualBasic.DLL中的Strings的Replace和相关函数抽取出来(C#),然后修补一下就可以单独使用了(我这明显是吃饱了撑着,VB专家装配脑袋指出我这是浪费时间,因为本身Microsoft VisualBasic运行库就包括在.NET Framework中)。

实战

以下是测试代码:
        static void Main(string[] args)
        {
            string segment = "中华aBc共和国";
            string source;
            string pattern = "abc";
            string destination = "人民";
            string result = "";
            const long count = 1000;
            StringBuilder pressure = new StringBuilder();
            HiPerfTimer time;

            for (int i = 0; i < count; i++)
            {
                pressure.Append(segment);
            }
            source = pressure.ToString();
            //regexp
            time = new HiPerfTimer();
            time.Start();
            for (int i = 0; i < count; i++)
            {
                result = Regex.Replace(source, pattern, destination, RegexOptions.IgnoreCase);
            }
            time.Stop();

            Console.WriteLine("regexp    =" + time.Duration + ":");

            //vb
            time = new HiPerfTimer();
            time.Start();
            for (int i = 0; i < count; i++)
            {
                result = Strings.Replace(source, pattern, destination, 1, -1, CompareMethod.Text);
            }
            time.Stop();

            Console.WriteLine("vb        =" + time.Duration + ":");

            //vbReplace
            time = new HiPerfTimer();
            time.Start();
            for (int i = 0; i < count; i++)
            {
                result = VBString.Replace(source, pattern, destination, 1, -1, StringCompareMethod.Text);
            }
            time.Stop();

            Console.WriteLine("vbReplace =" + time.Duration + ":" + result);

            //substring
            time = new HiPerfTimer();
            time.Start();
            for (int i = 0; i < count; i++)
            {
                result = StringHelper.ReplaceText(source, pattern, destination, StringHelper.CompareMethods.Text);
            }
            time.Stop();

            Console.WriteLine("substring =" + time.Duration + ":");

            //substring with stringbuilder
            time = new HiPerfTimer();
            time.Start();
            for (int i = 0; i < count; i++)
            {
                result = StringHelper.ReplaceTextB(source, pattern, destination, StringHelper.CompareMethods.Text);
            }
            time.Stop();

            Console.WriteLine("substringB=" + time.Duration + ":");

            Console.ReadLine();
        }

说明

这个代码演示了上述几种方法:要把字符串"中华aBc共和国"中的"abc"替换为"人民",注意:源子字符串是"aBc",要替换的是"abc",这里目的是要测试不区分大小写。

为了测试效率,我特意先把测试字符串累加1000次,然后循环测试1000次。

结果

以下是测试结果:
regexp      =1.38308285017339 //这是正则表达式,第3快;
vb            =0.525978828344589 //这是引用Microsoft VisualBasic RunTime的,次快;
vbReplace=0.522997341400086 //这就是用reflector改为C#的,最快;
substring  =21.8573638474698 //这是string.substring +,最慢
substringB=14.6346693500287 //这是string.substring StringBuilder,次慢,这里凸现了StringBuilder的速度;

这里仅仅是多次测试中的一次,我没有弄平均,大概数字吧,到底是vb快还是reflector的c#快,差不多...

是否应该使用Microsoft VisualBasic RunTime就见仁见智了。

posted @ 2010-11-23 22:12 pk3000lc 阅读(835) 评论(0) 编辑

现在有了新的发现,原来C#自带,居然一直没发现。

最近为了统计网页在服务端实际处理时间时翻到了这个属性:DateTime.Now.Ticks

private long times1 = 0;
protected override void OnPreInit(EventArgs e)
{
times1
= DateTime.Now.Ticks;
base.OnPreInit(e);
}
protected override void OnUnload(EventArgs e)
{
base.OnUnload(e);
times1
= DateTime.Now.Ticks - times1;
System.Diagnostics.Debug.WriteLine((times1
/ 10000000.0).ToString());
}

 

这里的ticks返回的是当前时刻的“100毫微秒”数,翻了下百度,毫微秒就是纳秒。10的九次方纳秒=1秒,所以要把ticks换成秒就要除以10的7次方。

注意要返回double型才行,否则默认为long型的话,基本上都会返回零了。因为代码实际处理时间通常很短,默认返回long的话会把后面小数点后的舍去。

posted @ 2010-06-18 01:08 pk3000lc 阅读(2369) 评论(10) 编辑

原标题:取得纳秒级时间

QueryPerformanceCounter获得CPU执行计数值

__int64 startTime

if(QueryPerformanceCounter((LARGE_INTEGER *)&startTime))

printf("QueryPerformanceCounter:%lf\n",(double)startTime);

http://www.cnblogs.com/wubiyu/archive/2008/09/11/1289034.html

 

精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。

故而,我们要另外寻找一种方法来精确测量时间。

Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。

第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。

然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。

duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率

需要关于 QueryPerformanceCounter 和 QueryPerformanceFrequency 的更多信息,请参阅 MSDN 文档。

代码
下面的类实现了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函数的功能。 using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;

namespace Win32
{
    internal class HiPerfTimer
    {
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(
            out long lpPerformanceCount);

        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(
            out long lpFrequency);

        private long startTime, stopTime;
        private long freq;

        // 构造函数
        public HiPerfTimer()
        {
            startTime = 0;
            stopTime  = 0;

            if (QueryPerformanceFrequency(out freq) == false)
            {
                // 不支持高性能计数器
                throw new Win32Exception();
            }
        }

        // 开始计时器
        public void Start()
        {
            // 来让等待线程工作
            Thread.Sleep(0);

            QueryPerformanceCounter(out startTime);
        }

        // 停止计时器
        public void Stop()
        {
            QueryPerformanceCounter(out stopTime);
        }

        // 返回计时器经过时间(单位:秒)
        public double Duration
        {
            get
            {
                return (double)(stopTime - startTime) / (double) freq;
            }
        }
    }
}

使用这个类很简单。只需要创建一个 HiPerfTimer 的实例,然后调用 Start() 开始计时,Stop() 停止计时。要获得经过的时间,调用 Duration() 函数即可。

参考下面的例子。 HiPerfTimer pt = new HiPerfTimer();     // 创建新的 HiPerfTimer 对象
pt.Start();                             // 启动计时器
Console.WriteLine("Test\n");            // 需要计时的代码
pt.Stop();                              // 停止计时器
Console.WriteLine("Duration: {0} sec\n",
     pt.Duration); // 打印需要计时部分代码的用时

 

另一种高精度计时方法:

private void button1_Click_1(object sender, EventArgs e)

{

    System.Diagnostics.Stopwatch MyWatch = new System.Diagnostics.Stopwatch();

    MyWatch.Start();

    System.Threading.Thread.Sleep(100);

    MyWatch.Stop();

    MessageBox.Show( MyWatch.ElapsedMilliseconds.ToString() + "毫秒");

}

////当计算时间进入纳秒级时,Stopwatch(最小精是毫秒) 是无法计时的,还Environment.TickCount获取系统启动应用程序的毫秒级。对于要求不高,计算时间在毫秒级可以用Stopwatc或Environment.TickCount。若有计算纳秒级的计时就只能使用上面第一种方法。

转自:http://blog.csdn.net/wenrenhua08/archive/2008/09/15/2903780.aspx

posted @ 2010-06-18 01:08 pk3000lc 阅读(181) 评论(0) 编辑

原文标题:.Net 实现纳秒级别计算
1)建立VC.NET 托管类库

using namespace System;

namespace MLTimerDot

{

        //得到计算机启动到现在的时钟周期

        unsigned __int64 GetCycleCount(void)

        {

                _asm  _emit 0x0F

                _asm  _emit 0x31

        }

        //声明 .NET 类

        public __gc class MLTimer

        {

        protected:

                UInt64 m_startcycle;

                UInt64 m_overhead;

        public:

                MLTimer(void)

                {

                        //为了计算更精确取得调用一个 GetCycleCount() 的时钟周期

                        m_overhead=0;

                        Start();

                        m_overhead=Stop();

                }

                //计算停止

                UInt64 Stop(void)

                {

                        return GetCycleCount()-m_startcycle-m_overhead;

                }

                //计算开始

                void Start(void)

                {

                        m_startcycle=GetCycleCount();

                }

                 __property virtual UInt64 get_Overhead()

                 {

                        return m_overhead;

                 }

        };

}

2)测试代码

//C# 引用后放一个Button 测试

private void button1_Click(object sender, System.EventArgs e)

{

        MLTimerDot.MLTimer timer=new MLTimerDot.MLTimer();

        timer.Start();

        Thread.Sleep(1000);

        UInt64 cpuspeed10=(ulong)(timer.Stop()/100000); //通过这个可以算出 CPU 的mhz

        timer.Start();//开始

        //测试代码(测试声明一个DataTable 用的时间)

        DataTable td= new DataTable();

        UInt64 time1=timer.Stop();//停止

        String s= String.Format("CPU {0}.{1} mhz\n声明 MLTimer 类的系统开销 {2:n} 时钟周期\n本操作系统开销 {3:n} 个时钟周期\n使用 {4:n} ns",

                cpuspeed10/10,cpuspeed10%10,timer.Overhead,

                time1,

                time1*10000/cpuspeed10);

        MessageBox.Show(s);

}

/*-------------------------------------------------------------------------------------------

MLTimer 类库必须使用VC。NET 开发,只有VC。NET 可以坠入汇编(爽)。

编译完成可以在任何.Net语言下使用(当然也可以封装成API , 或 com 组件)。

想想以后可以在网页上显示:

你本次查询使用了:xxxxx 纳秒。

是不是很爽^_^,当然还可以进行一些精密的计算,

这是在下在CSDN第2次发表文章。希望大家可以喜欢。

演示代码:

http://www.kairuisoft.com/uploads/MLTimerDot.rar

声明:本源代码你可以用于任何用途,不过用于商业程序时请通知本人,谢谢。QQ 65423574

转自:http://blog.csdn.net/FlashElf/archive/2004/06/23/24336.aspx

posted @ 2010-06-18 01:08 pk3000lc 阅读(150) 评论(0) 编辑

写在最前面的最先执行,Body的onload事件要在页面加载完后才执行。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题 3</title>
<script>
alert("1-最先执行");
</script>
</head>
<body onload="alert('3-最后执行');">
<script>
alert("2-接着执行");
</script>
</body>

</html>

posted @ 2010-06-18 01:08 pk3000lc 阅读(198) 评论(0) 编辑