下载VWD
今天安装了一下 VWD , 发现AspNet2.0Beta1有一个兼容性的Bug。这个问题主要是
<head id=”head1” runat=server> 在asp.net1.1之前是 HtmlGenericControl ,而在 Asp.Net2 中是 HtmlHead , 并且这个 HtmlHead 不是继承 HtmlGenericControl 的。
这就导致了这个文件不能编译过去:
Parser Error Message: The base class includes the field 'htmlHead', but its type (System.Web.UI.HtmlControls.HtmlGenericControl) is not compatible with the type of control (System.Web.UI.HtmlControls.HtmlHead).
解决方法当然有,不过很麻烦。希望能从 AspNet2 上直接把这个问题解决掉。
今天要在 SPS 里做个东西.不过一直都是这个错误:
System.TypeLoadException: 因为格式无效,未能从程序集 CuteChat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=da0fc3a24b6f18ba 中加载类型 CuteChat.ContextBoundModel.AspectObject。 at CuteChat.SPLib.ChatWebPart.WriteInternal(HtmlTextWriter output) at CuteChat.SPLib.ChatWebPart.RenderWebPart(HtmlTextWriter output) in l:\solutions\cutechat\extends\forsharepoint\cutechat.splib\chatwebpart.cs:line 45
呵呵。我实在是不知道为什么会出这个错误的。因为这个类在其他地方完全能正常使用。
当然,测试了一晚也不是说没有结果的。当我修改到web.config的的时候,情况变了。把WSS_Minimal改为Full并且重启动IIS就解决了。
不过这个错误提示和最后改权限的做法好象没有怎样对应啊。难道是低权限不能继承 ContextBoundObject ?..
看了 关于中文输入的一点小建议 里面的回复。我就装了MSPY2003。
其实我很早就想换微软拼音。不过就是因为一直都有一个很大的问题。(这个问题也就是很多其他输入法的问题)
就是它想智能一点,往往会把它认为你常用的字自动排到前面去(非常没有规律),而且没有提供选项来禁止“这么智能”的动作。
而这样的结果是,一个拼音里有几个字都是很常用的,但是位置却经常换来换去。这真的很多手!
我的一个建议是,在 1 的前面放一个常用字选择。这个字是用空格来选的。这样的话,其他字的编号就不用变了。
还有一点就是按Shift来切换中英文的问题。Shift是很常用的键,被它这么一搞,我很经常搞错中英文输入。这也很麻烦。同样,没有办法设置这个多余的行为。
当然,各人有各人的习惯,为什么就不提供选项去改变它呢 ?
下面的东西显示了在复杂的情况下,
怎样最好地在一个Element的旁边显示某个DIV。
要测试它,请点 ClickMe
当然,你可以滚动窗口,使这个按纽靠窗口的 左/上/右/下 的情况,观察菜单的弹出方位。
全部代码:
记得我刚出来的时候,还没有学DotNet呢。
那时主要是用ASP和DHTML,语言是JScript 。 本来打算重操旧业-学C++的。
不过写惯了脚本,就十分讨厌C++里操作字符串那么麻烦。所以就做了这个东西。
后来到了2002年11月时,我发现DotNet上手竟然那么的容易。。(我发现里面的东西和JScript,VB是很相似的。。) , 后来就转到DotNet中了。也不继续弄C++了。
所以我一个朋友学C++时,我硬把他拉到 C# 阵营里了。
不过今年过了后,我还是重新补充C++的知识的,毕竟学DotNet多了,需要学其他的东西补充一下。
这一个类体现了我对C++中内存管理的理念。 对于性能,我实在是不太要求。能保证是常规性能的1/4就够了。(总比C#的快吧,JScript的字符串操作都那么慢了,我还不是在用:)
当然,这些都是针对应用程序的角度去用的。 如果要做个被广泛应用的XMLParser之类的东西,当然还是用优化的方法好。
我想知道网上有没有类似的东西,或者开源项目?我比较感兴趣。
我使用Remoting也有很长的一段时间了。一直以来,我心中最痛的就是 DataRow不能序列化!
这使我无法这样地写 DataRow GetEmployee(int empid) , 而必须改为 DataTable GetEmployee(int empid) ;
自从发明了CBM后,这个也变成可能了。详细的代码如下:
这个代码的原理是,在客户端与服务器端通信的时候,如果发现有DataRow需要传输,则先把,这个参数换成null,
然后把DataRow打包在某个DataSet中,通过CallContext来进行传输。传输完毕后,再进行解包,把参数换会DataRow。
如果你有兴趣测试这个代码,可以到 http://www.contextboundmodel.net/ 里下载 CBM 的源代码。
通常,写一个WinForm的程序都会引用多个dll的。如果把这个WinForm发布出去,那么一个目录下就有很多个dll了。
如果希望只发布一个client.exe,那么应该怎样做呢?
做法很简单,就是把dll以资源的形式打包进 exe 里就好了。
然后问题就在于,你怎样才能在运行时加载这些dll。
一个可行的方法是,在程序运行的时候,一次过把这些dll都load出来,然后用AppDomain.Load来加载它。
但是这样有一个不好的地方,就是启动速度太慢。
AppDomain提供了一个事件,叫 AssemblyResolve ,这个事件是告诉你,DotNet找不到它想找的Assembly了。
通过关联这个事件,比较一下ResolveEventArgs.Name是否是你打包的那些东西,就能在需要的时候才加载dll了。
例子在这里下载 ResOfDll.zip
当然,如果你开发的是dll,并且引用别人的dll,也可以这样做。不过难点在于,你必须保证在需要使用其他dll的类之前,关联了AssemblyResolve这个事件。(这个可以在所有使用 其他dll的类 的类的静态构造方法中,执行一段代码来保证这个条件)
一直都想找IOleClientSite等接口的定义。不过找光了机器上的tlb文件都不行。
后来竟然发现,System.Windows.Forms.dll 里就有了。
这是我把它们抽出来的结果,不过还没有经过任何测试! nativedeclare.cs.txt
使用这个的用途是实现OLE里某些接口,然后可以脱离IWebBrowser2来直接 HOST MSHTML 了。
(想一想,用这个可以用程序截取某某网站的截图!)
5555,实在太感谢 IAMROBOT 了。http://www.mvps.org/emorcillo/vb6/tlb/olelib.shtml 里的tlb倒入后完全可以正常使用:)
我想不少人都知道 ElementBehavior 是什么回事。通常,我们是用 *.HTC 的形式,用脚本来编写它的。
但实际上,我们可以用C++,VB,甚至是用DotNet来编写ElementBehavior。
这个请看 MSHTML.IElementBehavior 的 BUG 里的例子。
用 DotNet 来写有什么好与不呢?
优:配合DotNet的类库,功能强大,使用DotNet语言优点(强类型,编译验证。。)。
缺:客户端必须装DotNet。
待补充。。。
那么用 DotNet 来写 Behavior 有什么用途呢?
一:可以写个非常强大的基于HTML的编辑器。(我怀疑VS.NET设计ASP.NET的界面就是用这个的。。)
二:结合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 应用程序。 写Behavior能起复用的效果。(例如鼠标移动变色这种东西)
待补充。。。
资源:
MSDN - Binary Behavior
IHtmlElement2 提供一个方法 addBehavior , 使用这个方法,我们可以编写托管的Behavior (用C#,VB)
但是在实际的尝试中,却发现其中有BUG。使用addBehavior后抛出 ExecutionEngineException 。这个是一个超级的Exception。使DotNet强制关闭,无法拦截。
后来这个问题在 http://itwriting.com/phorum/read.php?f=3&i=288&t=288 里有了描述。
里面给的解决方案是重新定义 IElementBehavior 。
我整理了一个简单的例子出来,下载 WinHtml.zip
从例子中看到 WinHtml.IElementBehavior 与 mshtml.IElementBehavior 中有一个不同处 : Notify 方法的参数类型不同。
这个就是导致异常的原因。不过按MSHTML的文档来看,mshtml.IElementBehavior的定义应该是对的。难道这是DotNet的BUG?
shensr 在他的 在ActiveX Form中加载.Net Control 提到了通过用传统的Window的父子关系来把 WinForm.Net 的 Control 嵌进 VB 的方法。
这个方法不错。
看来我想的把控件嵌到Html里的想法有了着落了。
博客园那边的朋友对为类生成动态代理的技术比较感兴趣。
如果有兴趣的话,可以看看这个 http://rail.dei.uc.pt/
我的PASSPORT是很早前注册的。当时可以用我自己的Email地址。
后来我想帮一个朋友注册一个时,发现只能支持 @hotmail.com 了。
今天想上去弄个新的邮箱,发现PASSPORT又支持自定义的邮件地址了。
不过有没有人知道,怎样申请一个 ???@msn.com 的邮箱?
Control.Invoke 的作用是发送一条Windows消息到控件的线程上执行指定的Delegate。
如果委托出现异常,那么就直接把这个异常拦截掉,然后在调用Control.Invoke的线程上抛出。
我倒是希望有个选项把这个拦截去掉。如果出现错误,直接在控件的线程上抛出,然后显示错误。这多好啊。
否则的话,出现错误,根本就没有提示。也不好调试。
只是偶而的发现。我在C#规范里好象没有见过这个的。还没有知道的可以了解一下:
public object @object
{
get
{
return this;
}
}
而使用它呢?
object something=theclassobj.@object
我用WinForm开发也有一段时间了。我觉得目前的WinForm开发速度是够的,但是一些原本在HTML就很容易做到的事情,在WinForm中就很难实现了。 这个主要的原因可能是WinForm复用控件的能力非常强,但是可用的控件却非常少。一般买回来的控件不但贵,而且也不是太好扩展。
作为一个学了多年HTML的人,我当然希望在WinForm中依然能使用HTML的特征,例如强大的CSS!,自动排版伸缩的特征,(CSS与排版可以更方便打印!),以及脚本的编写。(有时候写脚本比写WinForm的程序更爽。具体情况具体做)。
要做这个其实不难。但是要灵活运用则不容易了。
通常,使用WebBrowser控件的人,只是简单地使用MSHTML调用WebBrowser里的东西。也就是说,这个调用是单项的,只考虑到修改HTML来显示某种东西。
今天我写这个随笔的意图是告诉大家怎样把用户在WebBrowser里的操作反馈给WinForm 。
做这个反馈的基石是 DotNet 的 InteropServices 。通过把DotNet的某个对象,传到HTML DOM里去,然后用脚本来操作该DotNet对象。
要做到这个,核心是:
- 获取 WebBrowser.Document ,它实现了mshtml.IHtmlDocument /2/3/4/5 (其中IHtmlDocument2最有用)
- 这个Document是 System.Runtime.InteropServices.Expando.IExpando,通过它来设置和获取Document的一些动态命名的成员。
例子中的代码是:
mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)browser.Document;
System.Runtime.InteropServices.Expando.IExpando ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;
System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");
piform1.SetValue(doc2,this,null);//从此,在HTML的document.Form1就是这个WinForm的Control了。你可以用脚本来调用Form1 !
有了这些交互,我们可以实现的东西实在太多太多了。
我做了一个简单的例子,在这里下载 http://www.lostinet.com/files/WinHtml.zip
我下一步应该是研究一下,怎样直接把WinForm的Control动态地嵌进这个HTML里。(不是用 《 OBJECT 》来部署的形式)
朋友要求到。帖一个实现 IHttpModule 的例子:
要应用这个例子,需要在 web.config/machine.config 里添加 IHttpModule 的注册。详细看 DotNet SDK 里的 httpModules 的配置节。
当然 appSettings 也要注册连接字符串。
这个在这里出现过。不过好象没有太正式的介绍。
NDOC-http://ndoc.sourceforge.net/ 是一个帮助你把 xx.dll 以及 xx.dll.xml 这两个文件 或者是从vs.net.sln中导入 来生成在线文档和 xx.chm 的工具。
基本的用法是在 vs.net 的工程属性里,编译那里选择文档输出为 xx.dll.xml ,然后编译。那么程序中的注释编译后就成 xx.dll.xml 了。
用 NDOC Add 这个 xx.dll 和 xx.dll.xml 然后修改下面的一些选项,就可以compile了。通常这个会编译到一个单独的 doc\ 中。里面有一打堆的 .html 和 .hhp 等一些文件 。 当然还有 xx.chm 文件(要先安装HTMLHELP)。
效果如下
http://www.contextboundmodel.net/doc/index.html
编译出来的chm如下
http://www.contextboundmodel.net/doc/cbm.chm
刚才看了 Kaneboy 的 用Lostinet的ContextBoundModel来实现前置和后置条件检查 中的例子。
发现里面用到 ParameterInfo 时,定位它的位置是用 param.Position 。
这个我以前则没有留意到啊。所以我循环的时候不是foreach的,而是for(int i=0;i<ps.Length;i++)的(走弯路了。)。。
其实这个用于定位的属性在很多类都有,可是命名却不同。
例如: DataColumn.Ordinal , DataGridItem/DataListItem/Repeater.ItemIndex , ListViewItem/ColumnHeader/TreeNode/MenuItem.Index
以及 ParameterInfo.Position
有了这些属性,循环时可以直接用foreach了。
很可惜的就是 DataRow 没有这个。所以每次都是for(int i=0;i<rows.Length;i++)