網站首頁 編程語言 正文
在項目開發的過程中,不可避免的遇到這種情況:主程序由于算法的第三方庫使用的目標平臺需為X86的,但是在調用別家公司的程序或者是其他程序驅動不能為X86的(使用x64或者Any cup的沒問題)。
我遇到的連接oracle數據庫報異常“嘗試加載Oracle客戶端庫時引BadImageFormatException。如果在安裝32位Oracle客戶端組件的情況下以64位模式運行將出此問題”。這就不由的抱怨一句oracle數據庫真的是事多呀,一大堆的問題。
出現這種情況該怎么做呢,兩邊的平臺要求是不一樣的,不能修改。
第一種方法:使用其他的不用區分目標平臺的庫進行連接;
第二種方法:編寫一個exe程序,其對接的操作都在這個程序中實現,并由主程序調用。
下面我們就來說一下第二種方法的實現。
1、新建一個“控制臺應用程序”-- 在項目啟動類文件Program中Main()函數中接收傳遞來的參數;代碼如下:
public class Program
{
public static void Main(string[] args)
{
if(args.Length > 0 && !string.IsNullOrEmpty(args[0]))
{
string num = args[0];//獲取傳遞過來的參數
//DSCommuncationInfo 自定義的類;GetOracleData:連接Oracle數據庫和獲取數據函數
DSCommuncationInfo info = GetOracleData(num);
if (info != null)
{
//序列化成字符串數組
string result = SerializedXMLHelper.Serializer(info);
//將指定的字符串值(后跟當前行終止符)寫入標準輸出流。
Console.WriteLine(result);
}
}
}
}
2、主程序調用exe時,使用進程的方式把exe啟動,調用代碼如下:
public void StartExternalProgram(string examinerNo)
{
//這里在dll程序中調用exe,路徑是獲取dll所在路徑
string exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string exeName = "CterHisExe.exe";
string fileName = Path.Combine(exePath, exeName);
//使用進程
Process myProcess = new Process();
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.FileName = fileName;
myProcess.StartInfo.CreateNoWindow = true;
//傳參,參數以空格分隔,如果某個參數為空,可以傳入“”
myProcess.StartInfo.Arguments = examinerNo;
p.StartInfo.WorkingDirectory = exePath;//設置要啟動的進程的初始目錄
myProcess.Start();//啟動
myProcess.WaitForExit(15000);//等待exe程序處理完,超時15秒
string xmldata = myProcess.StandardOutput.ReadToEnd();//讀取exe中內存流數據
if (!string.IsNullOrEmpty(xmldata))
{
//自己實現的序列化
var info = SerializedXMLHelper.Deserializer(xmldata);
}
}
雖然這種方法比較復雜,但是也是解決平臺不兼容的可行方法之一。
Process.Start()無法啟動exe程序的問題:
1、可能是參數不是絕對路徑,exe的路徑地址不正確。
2、如果在外部直接運行exe程序沒有問題,而當這個程序中有配置文件,或在啟動的時候需要讀取其他文件時,需要設置StartInfo的WorkingDirectory屬性為應用程序的目錄。
原文鏈接:https://blog.csdn.net/BYH371256/article/details/126314868
相關推薦
- 2022-08-15 Docker常見用法
- 2024-02-26 Example動態(多條件)查詢
- 2022-07-23 Python實現環形鏈表_python
- 2022-11-23 .NET?SkiaSharp?生成二維碼驗證碼及指定區域截取方法實現_實用技巧
- 2022-11-02 Linux命令sed(流編輯器)的用法詳解_linux shell
- 2022-09-13 iOS自定義相機功能_IOS
- 2022-06-07 進行數據處理的6個?Python?代碼塊分享_python
- 2022-06-12 C#集合之有序列表的用法_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支