这个是com的主体文件
using System.Runtime.InteropServices;
using System.IO;
using System.Text;
using System.Security.Cryptography;
// 3desj加密
namespace _des
... {
[Guid("8B090A3D-9A44-4be6-9971-C7DFF9E111BB")]
//这个Guid 用工具---genguid 注册 生成一个系统没有用的值
public interface DBCOM_Interface
...{
[DispId(1)]
string DES3Encrypt(string strString, string strKey);
[DispId(2)]
string DES3Decrypt(string strString, string strKey);
[DispId(3)]
void Encrypt(ref byte[] Data, Int32 DataLen, byte[] Key);
}
// Events interface Database_COMObjectEvents
[Guid("356D756C-0E42-49d6-A646-AACF7B5B04A9"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
...{
}
[Guid("13045E25-F5F7-428c-8824-F36120195B97"),
ProgId("ClassNamespace._des"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class DBCOM_Class : DBCOM_Interface
...{
public string DES3Encrypt(string strString, string strKey)
...{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(Encoding.Default.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
DES.BlockSize = 64;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = Encoding.Default.GetBytes(strString);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
public string DES3Decrypt(string strString, string strKey)
...{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(Encoding.Default.GetBytes(strKey)); DES.Mode = CipherMode.ECB;
ICryptoTransform DESDecrypt = DES.CreateDecryptor();
string result = "";
try
...{
byte[] Buffer = Convert.FromBase64String(strString);
result = Encoding.Default.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
catch (System.Exception e)
...{
throw (new System.Exception("null", e));
}
return result;
}
}
这个是Com工程的AssemblyInfo.cs
[assembly:AssemblyKeyFile( " 3DES.keys " )]
// 这个3DES.keys 放到工程主目录下,是用Microsoft .NET Framework SDK v2.0中的bin下的sn.exe 生成的,下面有说明
// 主要作用是加一个强名集,做的途中发现必须加这个才能调用
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible( true )]
现在就可以把它生成一个dll文件了,比如叫3des.dll
我们现在需要把这个com注册,和其他开发语言的注册方式不同(如使用regsvr32 ), .net 开发的com注册步骤如下
为了方便,做成一个bat文件
sn -k 3des.keys
其中 path d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin 表示把查询目录指向这个目录,输入sn等命令是就不用加入这么长的目录标示了,它会自动查找上面的目录的。
sn -k 3des.keys 这个应该在编译dll文件之前执行,生成一个keys, com组件编译必须要这个
RegAsm 3des.dll 表示注册这个com,和 regsvr32 有类似的功能
gacutil -i 3des.dll 映射这个com
可以在windows/assembly/ 下面看有没有3des 这个映射.
这样一个.net 的com就完成了,下面将说delphi 调用的过程
interface
uses
Windows, COMOBJ, Activex, Classes, Controls, StdCtrls,
Messages, SysUtils, Variants, Graphics, Forms,
Dialogs;
type
TForm1 = class (TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
lbl2: TLabel;
lbl3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R * .dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
SharpObject: Variant;
TestValue: string;
begin
try
try
// 这个是调用的String
SharpObject : = CreateOleObject( ' _des.DBCOM_Class ' );
TestValue : = SharpObject.DES3Encrypt(Edit1.Text, Edit2.Text);
Edit3.Text : = TestValue;
TestValue : = SharpObject.DES3Decrypt(Edit3.Text, Edit2.Text);
Edit4.Text : = TestValue;
except
on e: exception do
begin
ShowMessage(e.Message);
end;
end;
finally
SharpObject : = Unassigned;
end;
end;
initialization
CoInitialize(nil);
finalization
CoUninitialize;
end.
效果图片
个人体会,如果说delphi做成的com 给.net 调用是一个完美的组合的话,那么反过来就感到十分的别扭了
//
Warning 1 Use command line option '/keyfile' or appropriate project settings instead of 'AssemblyKeyFile' E:/WordDir/STCOM/STCOM/Properties/AssemblyInfo.cs 18 12 STCOM
//把这个修改成Bat文件,修改其中的路径名称
/*
path d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin
PAUSE
sn -k E:/WordDir/STCOM/STCOM/bin/Release/keyfile.snk
PAUSE
tlbexp STCOM.dll /out:STCOM.tlb
PAUSE
D:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/RegAsm /tlb:STCOM.tlb STCOM.dll
PAUSE
gacutil -i STCOM.dll
PAUSE
*/