欢迎加入NBear官方MSN群:
nbeargroup@hotmail.com(将该帐号加为MSN好友即可加入组群,
在MSN聊天窗口点击震动图标即可查看群成员列表)
欢迎访问NBear官方Google Group讨论组,地址:
http://groups.google.com/group/nbeargroup(请大家尽量使用gmail帐号加入以获得最佳使用体验)
NBear中文用户手册
本手册按实体类定义、数据持久化支持、Web&AJAX支持、SOA和分布式支持、Step by Step教程、附录这六个方面,分别介绍NBear提供的核心类库的使用方法和相关资源。
第1-5章分别以代码实例,介绍每一部分主要的类库的使用方法;第6章给出一个Step by Step教程,手把手引导您熟悉核心类库的使用;第7章给出和NBear相关的其
它网上文章资源。
从sf.net下载NBear中文用户手册
从博客园下载NBear中文用户手册
目录清单
1. 实体类定义
2. 数据持久化
3. Web&AJAX
4. SOA和分布式开发
5. 加密解密组件
6. Step by Step教程
7. 附录:相关资源
NBear功能列表
· O/R映射时无需配置文件,充分利用命名约定
· 接口式实体类定义,简单清晰,易于描述系统
· 提供实体类生成工具,免除手写实体的工作量
· 动态实体类工厂,运行时动态Emit及缓存实体类接口的实现类
· 高性能实体类XML及JSON序列化
· 基于Provider模式的可扩展持久化数据库源支持
· 支持多数据库源
· 基于范型的强类型实体持久化及数据访问接口
· 基于容器的分布式服务工厂,透明的分布式服务调用和分发
· 基于.Net Remoting的分布式服务队列
· 扩展ASP.NET MasterPage, Pae, UserControl基类
· 基于用户控件的AJAX支持
· URL重写支持
· 常用UI控件
posted @ 2006-08-04 16:27
Teddy's Knowledge Base Views(11318)
Comments(106) Edit 收藏
Post Comment
非常感谢!请问NBear是否有开发路线图!是否会在框架里加入 象ibatis那样的缓存
支持!
敬佩Teddy坚持不懈地完善NBear!
希望园子里有更多的朋友研究NBear,帮助Teddy去完善NBear。
期待很久终于出现了。
支持此工程发展壮大,在性能和智能化上面继续优化!
ibatis的缓存,主要是指,数据层,框架根据你的配置 采用缓存策略的不同。比如你selcet数据后,下次selcet会取缓存的数据。当你更新数据后,框架又会自动的从新去数据库取数据。
3.8. Cache Models
Some values in a database are know to change slower than others. To improve performance, many developers like to cache often-used data to avoid making unnecessary trips back to the database. iBATIS provides its own caching system, that you configure through a <cacheModel> element.
The results from a query Mapped Statement can be cached simply by specifying the cacheModel parameter in the statement tag (seen above). A cache model is a configured cache that is defined within your DataMapper configuration file.
其框架提供多个类型的缓存:
"FIFO" "LRU" "MEMORY" ......
teddy有没有计划下一步支持sqlserver2005?
@edison1024
现在就是支持sqlserver2005的,用户手册中有说明。
可以象下面这样设置connectionstring设置。
<add name="Northwind" connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa" providerName="NBear.Data.SqlServer9.SqlDbProvider9"/>
不知道是不是bug。
代码如下:
public LukiyA_MusicEntities.music_AlbumsForSinger[] GetAlbumsForSinger(object singerId)
{
IDataReader dr = Gateways.LukiyA_Music.ExecuteProcedureReadOnly
("music_Albums_Operate", new string[] { "@Action", "@SingerId" }, new object[] { 4, singerId });
return EntityFactory<LukiyA_MusicEntities.music_AlbumsForSinger>.CreateObjectList(dr);
}
public LukiyA_MusicEntities.music_RecommendAlbums[] GetRecommendAlbums(object top, object garde)
{
IDataReader dr = Gateways.LukiyA_Music.ExecuteProcedureReadOnly
("music_Albums_Operate", new string[] { "@Action", "@TopSize", "@IsRecommend" }, new object[] { 5, top, garde });
return EntityFactory<LukiyA_MusicEntities.music_RecommendAlbums>.CreateObjectList(dr);
}
描述:
我怕存储过程太多不好管理,就在一个存储过程里写了几种常用的操作,用@Action参数控制具体执行哪一个。
结果在NBear里会出问题,如上,第一个方法的action为4,有2个参数,第二个也使用的同一个存储过程,action为5,有3个参数。
我首页会执行第二个方法,没有问题,但是访问另一个页面,需要用到第一个方法,就出现:
An SqlParameter with ParameterName '@SingerId' is not contained by this SqlParameterCollection.
如果重新启动程序,首先访问调用第一个方法的页面,就没问题,但是访问首页时,调用第二个方法出错,提示:
An SqlParameter with ParameterName '@TopSize' is not contained by this SqlParameterCollection.
@Lukiya
你遇到的问题应该command参数的缓存问题,对存储过程的访问会假设过程包含相同的参数列表,因此,如果你调用同一个存储过程却传入不同的的参数列表,第一次运行后参数@Action和@SingleId被缓存,第二次的时候,框架就不再构造参数列表了,直接使用上一次这个存储过程的参数列表,也就是@Action和@SingleId,第二次只是简单的对参数赋值,也就是说你第二次本来想传给@TopSize的参数实际上传给了@SingleId,@TopSize还是空值,因此就出现了这个错误。
不知道像你这样调用存储过程的情况是不是很普遍。暂时建议你每次都对所有参数赋值,不需要的参数传空值就行。在下一版本中,缓存参数时我会组合考虑存储过程名称和本次传递的参数列表作为缓存键值来避免这个问题。
hi,Teddy
我又来了,这套框架真好用:)
你有没做过压力测试?例如用在web网站开发方面能承受多大访问量?
我指的是非分布式系统网站。
如果性能可以,准备后续项目都用他了。cute~~~
@Lukiya
测试过,性能基本和DAAB相当,对于一般的web应用,框架本身不会成为性能瓶颈,建议在service层面上缓存常用数据减少数据库访问。
这里还有个有趣的事。
用存储过程创建实体(DataReader型)时,好像声明的
IDataReader dr = Gateways.LukiyA_Music.ExecuteProcedureReadOnly (xxx,xxx,xxx);
EntityFactory<LukiyA_MusicEntities.music_AlbumsForSinger>.CreateObjectList(dr);
这里的IDataReader貌似需要自己手动关闭下,是么?因为一直出现"超时时间以到...................."这样的错误。
我记得SqlHelper里仿佛是不需要的(不知道记错没)。
现在改成了:
using (IDataReader dr = Gateways.LukiyA_Music.ExecuteProcedureReadOnly(xx,xx,xx))
{
return EntityFactory<LukiyA_MusicEntities.music_AlbumsForSinger>.CreateObjectList(dr);
}
想问下,除了这里,还有其他地方需要手动关闭连接吗?
貌似我记错了…………
SqlHelper里也要关闭的…………
@Lukiya
是的,MSDN中有描述,对于所有的IDataReader,使用完必须尽早关闭,这个工作一般还是交给用户来做的。
再请教个问题。
CloseTransaction这个方法有什么用?
tran.Commit();
还要手动关闭事务吗?
不关有什么后果?
@Lukiya
最好对称地执行begin也执行close,不关闭,目前,理论上,不一定会有问题,但是,不能保证安全。另外,也可以使用System.Transactions.TransactionScope类的事务语法,这样会更简洁一些。
恩,我看了手册后已经改成TransactionScope了:)
save方法只是在内部简单传递对Insert或Update方法的调用,理论上不会和直接调用Insert或Update有区别。能说说更具体的情况吗?
我的测试中完全没问题,无论是save方法在传统Transaction语法下或.Net2.0的TransactionScope语法下。
try
{
using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
{
// 跟踪发现,执行下面的Save时抱错
ServiceFactory.GetService<IDownsService>().Save(entity);
scope.Complete();
}
}
catch (Exception exc)
{
return exc.Message;
}
提示
"MSDTC on server 'ComputerName' is unavailable."
我以前遇到过这种情况,那是因为我在事务中用了Select。Save方法的源代码我没看,不知道是不是也用了Select.
我好像明白了,不关框架的事,是我优化服务器时关错服务了,打开就OK。
百度真是好东西。
再问个问题。
我今天把聚簇索引从Id字段转到了CreateTime字段,提高查询速度。
我发现实体生成工具把[PrimaryKey]也移动到了CreateTime字段,请问会造成什么影响?
事实上,主键还是在ID字段,只是新增了个在CreateTime字段新增了个索引,并设置成了聚簇的。
我手动把[PrimaryKey]改回去了Id属性上,用后发现没什么问题,但是我想知道[PrimaryKey]的设置在内置Select查询上是不是有性能方面的影响?
@Lukiya
"生成工具把[PrimaryKey]也移动到了CreateTime字段"
--应该属于生成工具的bug。[PrimaryKey]的设置对查询性能没有影响,但是对分页查询有影响,如果不正确设置[PrimaryKey]可能会得不到正确的分页查询结果。
Select方法都没返回总记录数,前台要做分页控制器又需要手动再Count一次,岂不是要读两次数据库,是不是考虑out一个总纪录数出来?
还有,怎么才能接受从存储过程传出来的的OUTPUT的参数呢?
@Lukiya
在最新版本v2.1.4中新增了一个Gateway.SelectRowCount方法返回记录数。不过还是分页查询和总记录数查询要分两次查询。
如果使用存储过程的out参数,目前只能使用Gateway.Db这个对象来像DAAB的Database那样查询,也就是要自己构造一个command,设置out参数,执行查询,再从command获得返回值。
今后的版本我会考虑增加更透明地返回输出参数的支持。
恩,希望新版本里能把Output做的更融合架构一些,加油:)
验证码是7777,庆祝一下~~~~~~~
不定时的,程序会出现“需要强名称程序集”错误,刷新下又没了。
我检查了源程序,没发现强名称密匙,Why?
中文手册下载后解压出来的文件没有后缀名,无法打开?
@Robin
不会吧?你下载的是哪个链接?解压出来应该是chm的,我刚试过,是文件没问题的。
请问出现“需要强名称程序集”错误是怎么回事?
找了半天没找出原因,郁闷中。
@Lukiya
我没遇到过这样的问题,你找一下是不是你的解决方案中有某些工程需要强名称,另外,听说过某些IDE插件会造成这样的错误警告,可以卸载试试,能给你的建议只有这些了。
按照你的6. Step by Step教程
一步一步做下来,出现了问题
ServiceInterfaces.ISampleService service = ServiceFactory.GetService<ServiceInterfaces.ISampleService>();
报“The type initializer for 'ServiceFactory' threw an exception.”
监视一看,确实ServiceFactory.cs中的private static NBear.IoC.Service.ServiceFactory factory = new NBear.IoC.Service.ServiceFactory(new SimpleServiceContainer());
factory没有被初始化,这个是什么问题啊
谢谢答复。
而aspx页面报的错是:
The type name ServiceImpls.SampleServiceImpl, ServiceImpls could not be located。
不知道这个如何解决啊,(我和你skeleton/3Layered中的代码完全一样,)
@学习.NET----与世倶进
需要手动将ServiceImpls.dll复制到website的bin目录下,就能解决这个问题了。
好像不行啊,不管我是给website添加ServiceImpls引用,还是手动将ServiceImpls.dll复制到website的bin目录下,都有问题,不过你的3Layered好像是添加ServiceImpls引用的吧
我现在将common,data,等等的source都拷过去,现在是下面报错
container = new WindsorContainer(new XmlInterpreter());
The type name ServiceImpls.SampleServiceImpl, ServiceImpls could not be located。
@Steveson
别着急,你要确认一下几个地方,首先是你的实现Service的程序集到底是不是ServiceImpls.dll,再确认一下你实现的SampleServiceImpl的命名空间是不是ServiceImpls,程序集的名称和service实现类的全路径是必须和web.config中castle块中的设置一样的,否则就会像你遇到的情况这样找不到需要载入的类。
问题解决了,是web.config的问题。
谢谢Teddy!!!!!!
8.17版解决了存储过程按@Action区分会出现的缓存问题了吗?
@Lukiya
这个问题在更早之前的版本时就已经解决了,另外,现在也已经支持存储过程输出参数了。你可以试试。
Gateways.SqlServer9.Update<EntitiesBox.vpsp_Users>
(new string[] { "FtpPassword" }, new object[] { newPass }, id);
这里有个小bug,如果FtpPassword字段加上了“[]”就会出问题,我看了源码,这里没有象主键一样做判断。
例如
Gateways.SqlServer9.Update<EntitiesBox.vpsp_Users>
(new string[] { "[FtpPassword]" }, new object[] { newPass }, id);
就会出错。
还有,Gateway.cs的506行,循环调用,造成系统堆栈溢出。
Teddy:
能不能给个操作数据库的例子啊(insert,update)等等,
sample只有一个简单的select的例子
谢谢啦
@Lukiya
是的,这里不能加括号,我会在今后的版本多加一个判断。
Gateway.Update在2.1.7之前有一个死循环错误,请下载最新的2.1.8,已经修复了该错误。
@Steveson
更多使用示例请参考NBear.Test程序集,这里是对主要方法的测试代码,有各种示例。
新版我在Gateway里找不到Save方法了。
以前做的两个项目全部需要改成ActiveEntity的形式。
我有个疑问,如果用ActiveEntity,大部分插入删除修改都直接在界面层完成了,业务逻辑层会不会太薄了些。
我一直对3层的结构不是很明确,用了上几个版本后以为找到些感觉,但是现在有了ActieEntity,在封装一层会不会多余,另外,如果是在业务逻辑层调用ActiveEntity,那么他的自动判断修改了哪些字段的功能不是没用了?除非每个变动都写个方法………………
迷糊中,请解答。
参考:
我以前的业务逻辑层最常用的四个插入、更新、删除大致如下,会在里面做很多的判断什么的,现在有了ActiveEntity感觉找不到北了…………
string Insert(EntitiesBox.music_Songs entity);
string Delete(object id);
string Save(EntitiesBox.music_Songs entity, object id);
EntitiesBox.music_Songs Get(object id);
@Lukiya
你只需要将原来用Save的代码改用Gateway.Update(因为你原来的逻辑看起来就像仅仅是Update),不一定使用ActiveEntity来Save(Save会自动识别需要进行Insert还是Update的)。
ActiveEntity的最大作用除了自动判断更新了的字段之外,就是它能自动维护继承关系的级联更新、删除。因为当有继承关系时,一次插入、更新、删除等会需要操作多张关联的表,他在这里在轻量级的Gateway的基础上再封装一层来简化这种关系。
另外ActiveEntity属于主动对象模式,当然它在许多情形下是有利有弊的,可以参考一下网上关于主动对象的其他讨论,理解主动对象的意义。
我在打开src的NBearV2_VSTS_Full.sln的时候,vs.net 2005报不能打开NBear.Test程序集,
不知道这个是什么原因啊
说是此安装不支持该类型项目
是不是我的vs 2005 装的有问题?
多谢了
@Steveson
必须安装vs2005vsts才能打开,vs2005pro是打不开的。
不过你也可以用文本编辑器notepad打开看看啦~~;)
Teddy:
问你个urlrewrite的问题,我已经实现了
将localhost/website/icon映射到localhost/website/user/icon.aspx,
可是,在访问localhost/website/icon时,进行操作时(比如:在这个页面实现文件上传工能),操作完成后,他会跳转到localhost/website/user/icon.aspx,
这个问题该如何处理啊
谢谢了
@Steveson
要解决这个问题可以给<form>添加如下面这个onsubmit属性:
<form id="form1" runat="server" onsubmit="this.action=document.location.href;">
Teddy:
我遇到个这样的问题,再次来这里提问,有点不好意思了,哈哈
页面上一个
<asp:Button runat="server" ID="addData" Text="AddData" OnClick="addData_Click" />,是用来往数据库中增加一条记录的,
点击它后,可以成功地添加一条记录,
不过,点击它以后,每刷新一次页面,都会向数据库中添加一条记录,
点击它之前,按刷新,没有这个问题,
在asp.net 1.1中,没有这种现象呀,
难道asp.net 2.0变了?
多谢了,
这样啊,那这种情况应该如何处理啊,用什么方法来防止重复提交啊?
还有一个问题是:
我将localhost/website/icon映射到localhost/website/user/icon.aspx,
而当地址栏是localhost/website/user/icon.aspx时,我想将地址栏的内容写为localhost/website/icon,
不知道这个能不能实现啊
谢谢
用存储过程时有bug
第一次编译后运行没错,第二次浏览就出错,未将对象引用到实例。
是在这里,又是缓存。
public void AddParametersFromCache(DbCommand cmd, string[] paramNames)
{
Check.Require(cmd != null);
IDataParameter[] parameters = this.cache.GetCachedParameterSet(cmd, paramNames);
foreach (IDataParameter p in parameters) // 第二次运行到这里时parameters为空。
{
cmd.Parameters.Add(p);
}
}
出错语句
DataTable dt = Gateways.Default.ExecuteProcedure("drd_Threads_GetPaginatedThreads",
new string[] { "@ForumId", "@PageSize", "@PageIndex" },
new object[] { forumId, pageSize, pageIndex },
new string[] { "@PageAmount", "@RecordAmount" },
new DbType[] { DbType.Int32, DbType.Int32 },
out outArr).Tables[0];
我下了最新的2.2.1版
因为以前我提到过出现了“需要强名称错误。”所以现在我都习惯给你的源代码加上key。
但是这个版本加了强名称后用不了了,出现:
Could not load file or assembly 'NBear.Common, Version=2.2.1.19309, Culture=neutral, PublicKeyToken=1977cb63cbae17dd' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
去掉强名称后一切正常,不知道为什么……
@Lukiya
NBear的最新版本已经解决了ActiveEntity在new ActiveEntity<IEntityType>(gateway, entityObj)时不能从entityObj获得修改过的字段信息的问题。也就是说,现在,如果不想将ActiveEntity暴露到UI层,则只需从UI层传递entity到BLL,在BLL new ActiveEntity<IEntityType>(gateway, entityObj).Save()来更新实体。此时,只有修改过的字段会被包含在用于更新sql中。
这是一个很好的变更:)
但是关于我问到的强名称错误是怎么回事呢……郁闷中。
特别是和CuteEditor合用时,只要点了某些按钮,ShowModelDialog出来的窗口必然出现“需要强名称错误。”,不使用NBear则无此错误。奇怪ing.
@Lukiya
强名称错误的问题我这里从来没遇到过,不知你的cuteeditor版本是不是用.net1.1编译的?
另外,也可以检查一下frontpage server extention的设置。
因为我无法重现你说的问题,所以也只能给这点建议了。
有时候并不只是CuteEditor的问题。另一个项目没使用CuteEditor也会出现问题。
撇开这个不说。
从2.2.1版开始,就无法给NBear的源代码加强名称了。加了snk文件就无法使用。
这在以前版本里是不会有的。
虽然不用强名称也可以,但是很多朋友还是有这个需要的,我找不出问题……
@Lukiya
我查了一下原因,在没加强名称签名的情况下,当和其他有强名称的程序集共同使用时就可能报需要强名称签名错误。
而如果加上了强名称签名,则和没有加强名称的程序集共同使用时也会报需要强名称签名错误。
因此,如果系统使用的程序集中至少有一个是经过强名称签名的,则最好对全部程序集都进行签名。
我刚试了一下,给所有源码加上强名称签名就没问题了,不加签名的话,当程序中同时引用,尤其是动态载入,经过强名称签名的程序集就会报错。
@Lukiya
我已经重新上传了一个包含强名称签名的源码版本到sf.net了,版本号还是v2.2.3,重新下载一下就行。
我说的情况还和你有所不同,很奇怪,有时候会出问题,有时候运行很久都不出。
出错后刷新一下就没问题了。但是整得用户很不方便。
好,我赶紧试一试。
补充:但是使用CuteEditor,一弹出ShowModelDialog窗口必然出问题。
希望这次能解决。
SampleServiceImpl.cs中:
return Gateways.Northwind.Select<NorthwindEntities.Products>(pageSize, pageNo, null, null);
而在Gateway.cs中有:
public IEntityType[] Select<IEntityType>(int pageSize, int pageNo, string where, object[] paramValues)
和
public IEntityType[] Select<IEntityType>(int pageSize, int pageNo, WhereClip where, OrderByClip orderBy)
会报错的吧?
@Steveson
是的,新版本里对于(pageSize, pageNo, null, null);这样的调用,请用(pageSize, pageNo)代替,同样的Select(null, null)请用Select
All代替。
Teddy:
public IEntityType[] Select<IEntityType>(int pageSize, int pageNo, string where, object[] paramValues)
中的paramValues传过去有什么作用啊,怎么没有穿paramName过去?
能给个使用这个方法的例子吗?
比如说
Select<IEntityType>( 10, 1, "ID = 1", "?");
里面的"?"应该传什么过去啊?
谢谢了
能给个Insert的简单例子吗?
我的是vs2005pro的,打不开test
用notepad,看的我头都大了,谢谢啊
@Steveson
Insert的典型用法如下:
Gateway.Insert<Category>(catObj);
其中catObj是一个Category实例,Category是一个接口,可以通过下面的方法创建一个新的Category实例然后调用上面的Insert:
Category catObj = EntityFactory<Category>.CreateObject();
catObj.Name = "zzz";
...
ajaxhelper中如何使用asp.net内置的callback来调用服务端方法呀?
teddy能给个例子吗?
谢谢了
Teddy
我通过protected override void Render(HtmlTextWriter writer)
为了达到隐藏真实的路径(配合urlrewrite),从而使页面Form中的action="",
这样一来导致了ajax失效了。
是不是Form的action一定是当前的页面的有效值,ajax才能起作用?
有没有什么解决办法啊?
谢谢了。
请问一下,我现在把NBear用于Web Service中时,如何实现序列化?我的方法代码为:
/// <summary>
/// 查询所有用户
/// </summary>
/// <returns>所有用户列表</returns>
[WebMethod]
public User[] SelectAllUser()
{
return Gateway.Default.SelectAll<User>();
}
这样提示错误:无法序列化接口 BugReport.Entity.User
我试过在User实体接口上添加[Serializable]或继承ISerializable接口都会出错。
谢谢了
@兰亭
对于WebService,参数和返回值是不能使用接口的。如果要暴露为ws的参数,需要使用非接口参数。请参考用户手册中的“自定义实体实现部分”,对ws暴露自定义实体具体类型,代替接口类型,就可以自动序列化了。
@Teddy's Knowledge Base
你好。在用户手册中的“自定义实体实现部分”我已经看过了,如果这样实现的话,这些类是否都应实现其相应的实体接口呢?而且是否需要为每个实体都要实现一个自定义类呢?
我主要考虑这样的话工作量会很大(Web Service需要返回每个数据表中的实体对象,每个实体类可能都需要实现一个自定义类),而且无法使用NBear自身已经具备的接口实现功能。
如果你方便的话,能否提供一个小例子,非常感谢。
@兰亭
在最新的v2.2.8版中包含了一个NBear.Tools.EntityImpl.exe工具,该工具用来生成所有的接口实体的显式实现类代码,这个版本已经可以从sf.net下载了。用户手册的实体定义-〉EntityImpl部分有简单说明。我会在下一篇的视频教程中更详细的说明该工具使用。
@兰亭
我又发布了一个v2.2.9,包含了一个Web Service的演示程序SampleWS,在NBear\sample\SampleWS目录下,我想对你会有帮助~~
希望官方提供NBear.Tools.EntityGen.exe的连接字符串记录功能。
不然版本一更新就要自己改。好麻烦。
还有,是不是互联网机器之间无法使用TransactionScope?
老是提示底层通讯错误。
MSDTC是开了的,网络验证也设置好了。
找了资料,说必须要开启了NetBIOS的局域网机器直接才能用TransactionScope功能。真的吗?
@Lukiya
谢谢建议,我会在今后版本添加连接字串记忆功能~~
跨局域网的TransactionScope理论上是可以通过MSDTC支持事务的,但是,我也没有这方面的经验,共同学习~~
@Lukiya
新版本v2.3.0已经增加EntityGen的数据库连接字串记忆/自动完成功能了~~
不小心碰到了 NB 还不知道他是什么东西?
请问在一个WEB SERVICE 框架下
如下步骤
NB 在哪个步骤(层次)发挥作用?
1:WEB页面
2:数据传输方式
3:数据处理
4:数据库访问
5:业务逻辑
6:业务实现
@海边拾贝的流浪者
那样的话,一般就是作为一个持久化组件来使用NBear。
PS
1:你的帮助手册总是打不开哦 换了rar/zip都是如此
提示 “没有找到压缩文件”
2:你的东西和 MS 的ATLAS 有没有什么相同只处 是什么关系
Mr. Teddy
麻烦您把
1:NBear中文用户手册(我下载了 不过解压缩时都 提示 找不到要所文件/压缩文件已经破坏 )
2:SWF的讲演的ppt文件(我的电脑根本看不到内容 没有您说的那么高的分辨率哦 郁闷)
发给我一份
想册地的研究一下NB 到底是什么?
sampanvip@163.com
谢谢
这个工具:NBear.Tools.EntityImpl.exe不是太好用,经常出错,版本:2.4.6
刚下载了一个新版本:3.2.2的,发现改变了很多,原先的Entity是在NBear.Common下,新的不是。引用了几个也没发现是在哪个空间里面。
出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。
输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。
官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar