markdown
# 背景
因為有RPG程式老舊但一時間又不能轉出來,只能先靠程式去呼叫,
所以就用C#引用AS400元件去呼叫RPG,得到結果。
# 使用DLL
`C:\Program Files (x86)\IBM\Client Access\Shared\cwbx.dll`
# 加入參考的時候要注意內嵌 Interop 型別的問題
REF:http://blog.miniasp.com/post/2010/06/21/dot-net-4-Interop-type-cannot-be-embedded-Use-the-applicable-interface-instead.aspx
# 程式碼參考:
REF:http://forums.asp.net/t/1817332.aspx?calling+as400+programs+from+c+
```C#
using cwbx;
public string getRPGProgramReturnValue(string functionName, string LibraryName, string ProgramName, ProgramParameters parameters, string outputParameterName, out CUDResult msg)
{
msg = new CUDResult();
string result = string.Empty;
StringConverter stringConverter = new StringConverterClass();
AS400System system = new AS400System();
try
{
// 定義 AS400 連線資訊
system.Define("AS400");
system.UserID = "你的帳號";
system.Password = "你的密碼";
//注意:一定要是IP,用domain網址會跳一個"CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87"的錯誤
system.IPAddress = "你的伺服器IP";
system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);
// 有連線才繼續
if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1)
{
// 宣告程式物件 連到系統
cwbx.Program program = new cwbx.Program();
program.LibraryName = LibraryName;
program.ProgramName = ProgramName;
program.system = system;
// 呼叫程式
try
{
program.Call(parameters);
}
catch (Exception ex)
{
msg.status = false;
msg.msg += "呼叫程式時發生錯誤:" + ex.Message + "\n";
if (system.Errors.Count > 0)
{
msg.msg += "呼叫程式時發生system錯誤:";
foreach (cwbx.Error error in system.Errors)
{
msg.status = false;
msg.msg += error.Text + "\n";
}
}
if (program.Errors.Count > 0)
{
msg.msg += "呼叫程式時發生program錯誤:";
foreach (cwbx.Error error in program.Errors)
{
msg.status = false;
msg.msg += error.Text + "\n";
}
}
}
result = stringConverter.FromBytes(parameters[outputParameterName].Value);
}
else
{
msg.status = false;
msg.msg += "無法連線到AS400 ServiceRemoteCmd\n";
}
system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
msg.status = true;
}
catch (Exception ex)
{
system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
msg.status = false;
msg.msg += "執行" + functionName + "時發生錯誤:" + ex.Message + "\n";
}
return result;
}
```
# 追記
20180530 在改寫舊程式時我把IP換成DOMAIN,因應管理要求,
結果就跳出一個`CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87`的錯誤,
研究了半天想說自己沒改什麼東西,google也查不到什麼,
回頭看自己改的東西才想到那個欄位是IP,該不會不能填網址,
就改回IP,就正常了,算踩到一個雷。
但他還有一個`IPAddressLookupMode`屬性,我是沒試過。
沒有留言:
張貼留言