本指南详细介绍了如何运用C#编程语言中的反射机制来访问和操作金蝶软件的登录界面,旨在帮助开发者深入了解与应用这一技术手段。适合有一定C#基础并熟悉金蝶系统的用户参考学习。
### C#调用金蝶登录界面(反射)及使用说明
#### 一、概述
本段落档详细介绍了如何在C#程序中通过反射技术来调用金蝶软件的登录界面,并解析获取到的一些关键信息,如账户名、用户名、用户ID以及数据库连接字符串等。
#### 二、反射简介
.NET框架中的反射特性允许我们动态地获取类型的信息并操作这些类型。本案例中我们将使用该特性通过COM接口与金蝶系统进行交互。
#### 三、代码解析
##### 1. 类定义与成员变量初始化
```csharp
public class KingdeeLogin {
private object _kingdeeLoginObject;
private Type _kingdeeLoginType;
private string _sqlConnectionString;
private string _accountName;
private string _userName;
private int _userId;
public KingdeeLogin() {
_kingdeeLoginType = Type.GetTypeFromProgID(K3Login.ClsLogin, true);
_kingdeeLoginObject = Activator.CreateInstance(_kingdeeLoginType);
// 初始化其他成员变量
}
}
```
在这个类中,我们定义了一些私有成员变量来存储与金蝶登录对象有关的信息。通过`GetTypeFromProgID`方法获取金蝶登录组件的类型,并使用`Activator.CreateInstance`创建该类型的实例。
##### 2. 登录验证
```csharp
public bool CheckLogin() {
var result = _kingdeeLoginType.InvokeMember(CheckLogin,
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, _kingdeeLoginObject, null);
bool bResult = (bool)result;
if(bResult)
InitialLoginDatas();
return bResult;
}
```
该方法用于执行登录验证。使用`InvokeMember`调用金蝶登录组件的`CheckLogin`方法,并根据返回值判断是否成功登陆,若成功则初始化数据。
##### 3. 初始化登录数据
```csharp
private void InitialLoginDatas() {
string kingdeePropString = _kingdeeLoginType.InvokeMember(PropsString,
BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public,
null, _kingdeeLoginObject, null).ToString();
_accountName = _kingdeeLoginType.InvokeMember(AcctName,
BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public,
null, _kingdeeLoginObject, null).ToString();
ParsePropStringToField(kingdeePropString);
}
```
此方法用于获取登录后的属性字符串和账户名称,然后调用`ParsePropStringToField`方法解析这些信息。
##### 4. 属性字符串解析
```csharp
private void ParsePropStringToField(string propString) {
var datas = ReadPropStringToDictinary(propString);
_userName = GetValueFromDictionay(UserName, datas);
_userId = int.Parse(GetValueFromDictionay(UserID, datas));
_sqlConnectionString = ConvertSqlConnectionString(GetValueFromDictionay(ConnectString, datas));
}
```
在这个方法中,首先将属性字符串转换为字典形式,并从其中获取用户名、用户ID和数据库连接字符串。
##### 5. 字典操作与SQL连接字符串转换
虽然原文中的这部分代码不完整,但可以推测出其主要功能是读取字典中的值以及将OLE DB格式的连接字符串转化为适用于SQL Server的格式。
```csharp
private string GetValueFromDictionay(string key, Dictionary dictionary) {
// 假设字典已经正确构建
return dictionary[key];
}
private string ConvertSqlConnectionString(string oleDbConnectionString) {
OleDbConnectionStringBuilder oleBuilder = new OleDbConnectionStringBuilder(oleDbConnectionString);
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
// 将OLE DB连接字符串中的相关信息复制到SQL Server连接字符串中,如数据源、初始目录和用户ID
sqlBuilder.DataSource = oleBuilder.DataSource;
sqlBuilder.InitialCatalog = oleBuilder.InitialCatalog;
sqlBuilder.UserID = oleBuilder.UserID;
return sqlBuilder.ConnectionString;
}
```
#### 四、总结
通过反射技术可以在C#程序中实现与金蝶系统的交互,这提高了开发效率并避免了硬编码的弊端。但在实际应用过程中需要考虑安全性及异常处理等问题,确保代码的安全性和稳定性,并严格审查以防止信息泄露等风险。