显示具有 .NET 标签的文章。 显示所有文章
显示具有 .NET 标签的文章。 显示所有文章

2007年10月30日 星期二

一些关于 Add-In VSTO 2008的资源

部署Addin
http://blogs.msdn.com/pstubbs/archive/2007/05/17/vsto-my-favorite-feature-clickonce-deployment.aspx

对于Office 2007 Word Addin小小的探索
http://www.cnblogs.com/allenlooplee/archive/2007/09/19/898983.html


MSDN Paul Stubbs about VSTO

http://blogs.msdn.com/pstubbs/archive/tags/VSTO/default.aspx

Addin 部署
http://www.cnblogs.com/epjnpe/archive/2007/09/23/902924.html

2007年10月29日 星期一

如何用Code Access Security技术来保护代码,使代码不致被恶意调用

  作为一名.NET开发人员,你没日没夜地写代码,你的组件运行在越来越多的机器上。忽然有一天,你发现你写的组件被引用在别人写的项目里,而且最可气的是,那人竟用你的名义在做破坏它人系统的恶事!你忍不住了,大叫一声Oh shit!,然后打开MSDN,看看有什么办法能帮助你阻止这场阴谋。
  OK,办法找到了,那就是。NET平台提供的Code Access Security.有大量继承于CodeAccessPermission的类可以帮你实现不同方面、不同范围的代码安全控制。你所需要做的只是从中挑出最适合的类别加以应用,从而达到保护你的组件的目的。
  在经过一番挑选之后,你最终确定了使用StrongNameIdentityPermissionAttribute类。这个类允许你将组件(或类、方法)与某一强名称(通常就是你发布程序时所用的强名称)绑定,这样,只有在客户端程序具有该强名称签名的情况下才能使用你的组件。也就是说,除了你自己编写的客户端代码因为拥有同样的签名而被允许使用组件以外,任何第三方代码都无法通过StrongNameIdentityPermissionAttribute的防护,因此也就无法恶意调用你的组件了:)。听起来真的不错,马上就动手做吧!
  为了简便起见,先创建一个很简单的Class Library项目,代码如下:
  // SecureComp.dll
  using System;
  namespace musicland
  {  
public class SecureComp
  {
  public string Confidential()
  {
  return "This is confidential!";
  }
  }
  }
  现在的这个组件非常可怜,因为任何人都可以写代码来调用它。下面,你就要耍点手段了:):
  首先引入System.Security.Permissions命名空间:
  using System.Security.Permissions;
  然后,在组件级加上StrongNameIdentityPermissionAttribute属性:
  [assembly: StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum,  PublicKey="0024000004800000940000000602000000240000525341310004000001000100c11c8497d“+  “283259f23d645358d65812b69136846b03a7d15124545fc3ed27d89d1330cceda4232c7bc6e8a0e7ecd857f8”+  “126d0859e2300237b3cab6f7737a92f585cbf2afb4b475c537703efb96e17e5921ff00c6e022b22f3d772f14”+  “6a3a5c7f6ccad3131b8d0465e6709e5a28cc3ca1c8b610af4162c1a18c0feb8e6993ab1")]  namespace musicland …
  注意,这里使用了SecurityAction.RequestMinimum,这申明除非获得StrongNameIdentityPermissionAttribute所表明的资源访问权限(即对SecureComp.dll组件的访问权限,可以把SecureComp.dll看作一样资源),否则CLR不会准许调用方(即客户端代码)访问所请求的资源;此外,在PublicKey属性中加入了你所允许的公匙(Public Key)的十六进制表示(转化成字符串类型)。CRL在运行期间将依照这一段公匙来判断调用方是否合法,除非调用方拥有相应的私匙(Private Key),否则将无法访问。看来,平时一定要倍加保护你的密钥文件,因为密钥文件(特别是private key)的泄露将会成为你无尽恶梦的根源,而延迟签名(delay signing)在这里也就显得格外重要了:。)
  说到这里,你一定会有个大大的问号:这长长的一串PublicKey是怎么得出来的?难道要我凭空凑出来不成?当然不是。还记得那个Sn.exe工具吗?通过它就可以把PublicKey给提取出来。OK,打开你的命令行,定位到密钥文件所在目录并输入以下内容:
  sn –p Key.snk PublicKey.snk
  这样,提取出来的公匙信息就被存储在PublicKey.snk文件中。你现在只需把公匙信息读取出来并转化成适当的格式就可以了。这里,你可以使用。NET Framework自带的Secutil.exe工具,但据我所了解,Secutil工具的输出都是数组格式(我在自己的机器上测试了Secutil所提供的全部输出选项,但所得结果都是一样,这让我很感意外,不知大家是否有更好的办法),因此就动手自己写了一个小工具来完成这一读取和转换。大家如果感兴趣可以发邮件给我(因为我没有自己的网络空间可以存放。当然你也可以自己来写,因为它实在是太简单了,就是读取二进制文件)。
  好了,现在你的代码就被全副武装起来了。试着写一个Console客户端来调用SecureComp,结果怎么样?是不是“无法获得相应权限”?试着用Key.snk给客户端程序签名后再访问,这回可以访问了吧!:)

  结论:适当地应用Code Access Security可以使你的代码被保护起来,不致被第三方不正确调用;但是过多的安全保护也将造成代码运行效率下降,从而带来负面影响。

转载: http://dotnet.csdn.net/page/ee384219-8735-45d8-80fb-d365946d7ffb

2007年10月28日 星期日

Besti Talk折腰的第一个版本


黑色的Title是可以当MouseDown的时候接受窗体拖动的。
窗体边框是可以resizer的。这个问题在昨天的日志上已经提到了怎么实现。
阴影效果同样在昨天的日志中已经提及。
最大的问题是突然间Jabber服务器一个都登录不了了。真伤心。

通宵写程序容易发迷糊。 整个风格都是模仿Google talk完成的。对了,要值得提及的是:我把Google talk中的 设置和帮助标签放到了TrayIcon里了。那个不常用的按钮没有必要出现在重要的位置,去掉后可以把图像的照片调整的更加大,就美观多了。

这个.NET界面是折腰了。未来多月内修改一下,还是打算用WinAPI老老实实的完成。

2007年10月27日 星期六

How to Resize Windows with No Form border in .NET

如何在.NET调整一个无窗体边缘的窗体?

  在Naio Talk的界面设计部分,由于项目周期的问题以及对Windows系统编程尤其是消息传递机制的不熟悉,选择了.NET来开发。为了使得克服.NET带来的窗体反应迟钝感,打算对Naio Talk的界面经行彻底精心设计。

  其中计划将Naio Talk的主界面的窗体边框去掉。一是减少重绘,二是看上去更加轻薄。

首先设置窗体FormBorderStyle = None;
然后添加如下C#代码即可。

protected override void WndProc(ref Message m)
{base.WndProc(ref m);
switch (m.Msg)
{
case WM_NCHITTEST:
Point vPoint = new Point((int)m.LParam &
0xFFFF,

(int)m.LParam >> 16 &
0xFFFF);

vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height -5)
m.Result = (IntPtr)HTBOTTOMLEFT;
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMRIGHT;
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOP;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOM;
break;
}
}
}

以及如下的成员变量。

const int WM_NCHITTEST = 0x0084;
const int HTLEFT = 10;
const int HTRIGHT = 11;
const int HTTOP = 12;
const int HTTOPLEFT = 13;
const int HTTOPRIGHT = 14;
const int HTBOTTOM = 15;
const int HTBOTTOMLEFT = 0x10;
const int HTBOTTOMRIGHT = 17;



2007年10月26日 星期五

如何设置Google企业用户帐号连接Google Talk服务

  如果你使用Google Talk来连接您的Google App(Google 企业应用程序),那么您不会碰到无法连接的问题。

  然而,企业用户毕竟是个企业,而非个人。必然有企业的需求,这也是会出现那么多Enterprise版本的原因吧。
企业内部可能需要自己的通讯客户端。比如YourCompany Talk.不过我在完成一个Besti Talk的时候,发现 -_-我竟然连不上Google 的Jabber服务器。后来才发现配置的问题。
以下是正确配置和使用agsXMPP SDK的参考代码。

string input = support@naionetwork.net;
Jid jid = new Jid(input);
_connection.Server= jid.Server;
_connection.Username= jid.User;
_connection.Password= “my password”;
_connection.Resource= "psi";
_connection.Priority= 10; //一般我习惯写5
_connection.Port= 5223;
_connection.UseSSL= true
_connection.AutoResolveConnectServer=False;
_connection.ConnectServer ="talk.google.com";//not null
_connection.SocketConnectionType =agsXMPP.net.SocketConnectionType.Direct;
_connection.UseStartTLS = true;


  如果我的Google App帐号是support@naionetwork.net
  则 jid.server = naionetwork.net
  这里要区别的是ConnectServer = "talk.google.com"。同时你要记得设置AutoResolveConnectServer为False.否则就找naionetwork.net来连接您的Jabber服务器了。如果您使用Google App帐号,显然无法成功通讯了。

2007年10月24日 星期三

无.Net Framework环境部署.NET程序技巧

部署问题已经成为Visual Studio 2005开发人员最担心的问题。从Visual Studio 6.0走来,就连部署一个C++项目,都变的开始麻烦。包括到后来VS2005中的manifest生成不确定问题。

这里要说的是C#程序部署的问题。

当前很多客户都在使用Windows XP Professsional,由于安全因素的考虑,他们的电脑几乎都没有上网和升级,欲安装.NET Framework不能忘记首先需要Windows Installer 3.0。

中国电信的飞信使用了.NET 框架进行开发。唯一值得一提的是飞信的部署非常值得借鉴:使用了类似虚拟一个.NET Framework环境的程序。原理和道理很简单,但是具体的接口对于开发人员来说非常繁琐,要弄清楚.NET Framework使用和设置了那些注册表和配置,你也可以模拟一个虚拟机。

对于普通的研究来说,直接下载飞新安装包。运行并安装飞信。在其目录X:\Program Files\China Mobile\Fetion\VMDotNet\v2.0.50727 下有一文件FetionVM.exe。

如何使用该技巧的两种方法:
  • 调试:FetionVM.exe example.exe
    这样就能运行起你的example.exe了。

  • 隐藏细节的方法:
    使用非.NET如MFC编写一个窗体项目,窗体初始化将其隐藏属性。然后使用exec或其他类似方法调用FectionVM.exe 参数example.exe。即可。


注意!
  1. 你同样可以传递路径,但是路径中绝对不能有空格。所以建议你使用相对路径
  2. 如果无法运行起example.exe。FetcionVM.exe会在同目录下产生错误日志文件,仔细分析日志,您同样可以解决你出现的一些问题。
  3. 如果您在商用产品中使用该方法,请咨询贵公司律师意见。

在.NET中使用Sqlite的解决方案

使用正确的Wrapper将使得在C#中使用Sqlite更加方便。半年前试图在C#中通过调用普通DLL的方法使用Sqlite,比较繁琐。这里又一个phpguru的SQLite.NET wrapper,使用起来和Visual Studio自带的库能很自然的结合。

开发文档:
http://www.phpguru.org/static/SQLite.NET.html

下载:
http://www.phpguru.org/downloads/csharp/SQLite.NET/

使用范例:

using SQLite.NET;


Open



try
{
Console.WriteLine("opening db...");
// Open database
SQLiteClient db = new SQLiteClient("c:\test.db");

}
catch (SQLiteException e)
{
Console.WriteLine("Fatal error: {0}", e.Message);
return;
}

Select:


ArrayList tables = db.GetColumn("SELECT name FROM sqlite_master WHERE type = 'table'");

foreach (string tableName in tables)
{
Console.WriteLine("\t" + tableName);
}
 
(L)1984 - 2007 TONY CHEUNG