1、现在SharePoint网站中建立自定义列表,方便测试开发的结果
列表名称为“应聘者列表”,添加“应聘者”“应聘时间”两个栏
默认有一个标题栏,我们让他显示“应聘者”+“应聘时间”
在VS2005中建立一个类库,添加
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI\Microsoft.SharePoint.dll
引用
添加代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace EventHandler
{
public class EventHandlerTest : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
DisableEventFiring();
SPListItem item = properties.ListItem;
string name = item["应聘者"].ToString();
string date = Convert.ToDateTime(item["应聘时间"].ToString()).ToShortDateString();
item["标题"] = name + "(" + date + ")";
item.Update();
}
public override void ItemUpdated(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
string name = item["应聘者"].ToString();
string date = Convert.ToDateTime(item["应聘时间"].ToString()).ToShortDateString();
item["标题"] = name + "(" + date + ")";
this.DisableEventFiring();
item.Update();
this.EnableEventFiring();
}
public override void ItemDeleting(SPItemEventProperties properties)
{
properties.ErrorMessage = "该文档不能被删除";
properties.Cancel = true;
}
}
}
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace EventHandler
{
public class EventHandlerTest : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
DisableEventFiring();
SPListItem item = properties.ListItem;
string name = item["应聘者"].ToString();
string date = Convert.ToDateTime(item["应聘时间"].ToString()).ToShortDateString();
item["标题"] = name + "(" + date + ")";
item.Update();
}
public override void ItemUpdated(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
string name = item["应聘者"].ToString();
string date = Convert.ToDateTime(item["应聘时间"].ToString()).ToShortDateString();
item["标题"] = name + "(" + date + ")";
this.DisableEventFiring();
item.Update();
this.EnableEventFiring();
}
public override void ItemDeleting(SPItemEventProperties properties)
{
properties.ErrorMessage = "该文档不能被删除";
properties.Cancel = true;
}
}
}
2、打开VS2005中的命令行工具
【开始】【程序】【VS2005】【tools】【命令行工具】
输入,启动强命名工具,给程序集添加密钥
sn -k c:/key.snk
在C盘建立一个密钥文件,拷贝到EventHandler的根目录,然后再AssemblyInfo.cs文件中添加一行
[assembly :AssemblyKeyFile("key.snk")]
如果项目中没有AssemblyInfo.cs文件,请先添加这个文件,然后再文件中添加以上这行内容
编译,产生EventHandler.dll文件
3、将EventHandler.dll文件拖放进入GAC目录,也就是C:\WINDOWS\assembly目录
下面开始部署这个EventHandler.dll,可以使用feature,可以上网搜索,这里编写一个命令行程序,来进行部署
代码如下
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SPSite collection = new SPSite("http://virus/sites/intranet/"); //站点
SPWeb site = collection.OpenWeb("sdev"); //子站点
site.AllowUnsafeUpdates = true;
collection.AllowUnsafeUpdates = true;
SPList mylist = site.Lists["应聘者列表"];//列表
string assName = "EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=93f56dedad11cead";
string className = "EventHandler.EventHandlerTest";
mylist.EventReceivers.Add(SPEventReceiverType.ItemAdded, assName, className);
mylist.EventReceivers.Add(SPEventReceiverType.ItemUpdated, assName, className);
mylist.EventReceivers.Add(SPEventReceiverType.ItemDeleting, assName, className);
//for (int i = mylist.EventReceivers.Count - 1; i >= 0; i--)
//{
// mylist.EventReceivers[i].Delete();
//} //这段是执行删除那些事件
Console.WriteLine("It's OK");
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SPSite collection = new SPSite("http://virus/sites/intranet/"); //站点
SPWeb site = collection.OpenWeb("sdev"); //子站点
site.AllowUnsafeUpdates = true;
collection.AllowUnsafeUpdates = true;
SPList mylist = site.Lists["应聘者列表"];//列表
string assName = "EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=93f56dedad11cead";
string className = "EventHandler.EventHandlerTest";
mylist.EventReceivers.Add(SPEventReceiverType.ItemAdded, assName, className);
mylist.EventReceivers.Add(SPEventReceiverType.ItemUpdated, assName, className);
mylist.EventReceivers.Add(SPEventReceiverType.ItemDeleting, assName, className);
//for (int i = mylist.EventReceivers.Count - 1; i >= 0; i--)
//{
// mylist.EventReceivers[i].Delete();
//} //这段是执行删除那些事件
Console.WriteLine("It's OK");
Console.ReadLine();
}
}
}
运行这个命令行程序,然后运行
iisreset
重启IIS,这时候可以试一下添加的效果了。
string assName = "EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=93f56dedad11cead";
中的PublicKeyToken,可以通过命令
sn -T HRItemEventHandler.dll
来查看,不过首先要进入bin/debug目录执行以上命令才可以
为程序强签名还有一个方便的办法,就是【右键】项目名称,选择【属性】,点击【签名】页,选中下面的为程序集签名,选择新建,这样程序的程序集就是一个强签名(强命名)的程序集了。
补充一些其他网站的内容,以下内容为摘抄,如有版权,请见谅。
GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。
关于GAC本身,上面redcaff_l所引述的一段话正是MSDN中对GAC的定义。GAC全称是Global Assembly Cache,他的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms 等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如 果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework \v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的 升级和版本控制。
除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly:
1)创建一个strong-name的Assembly,例如ToolbarComponent.dll
2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC
3)在程序中动态装载:
System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f");
MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache);
在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置 ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil -l"查到。
另外,上面提到了GAC中的Assembly必须是strong-name的。创建strong-name的Assembly的步骤大致如下:
a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。
b) 在VS.NET里面修改“AssemblyInfo.cs”文件:
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\keyPair.snk")]
c) 编译项目,就能得到一个strong-name的Assembly。
MSDN中有一些对GAC的介绍,您可以参考:
1)《Assembly Cache Viewer (Shfusion.dll)》
2)《Global Assembly Cache》
.NET Framework中附带了一些和GAC有关的工具,其中包括:
1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly
2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image
3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。