|||
C#可以直接通过COM组件的方式调用IDL进行一体化编程开发,这样的一体化开发可以充分集中C#和IDL优势。IDL提供了两个COM组件,IDLDrawWidget和COM_IDL_CONNECT。这两个组件在使用上各有侧重点,IDLDrawWidget是带UI的可视组件但函数调用不够完善(如envi的fx就无法通过这个调用),COM_IDL_CONNECT是不带UI的组件但可以调用所有的函数,这样在使用的时候可以根据需求进行选取。
C#调用IDL的原理或机理是C#可以调用组件的方法实现IDL的命令行的功能,而IDL的命令行下可以通过命令编译运行IDL的代码或sav文件。下面对两个常见问题进行分析,1是代码的调用和执行格式,2是路径过长时的截断问题的解决。
一、调用代码的格式
在IDL的命令行中进行代码的编译和金额运行的写法为:
IDL> ;编译源码”c:temptest.pro”
IDL> .compile 'c:temptest.pro'
IDL> ;运行test, pro中其他函数或过程均可以直接调用,因已经编译过了。
IDL> test
C#中调用的格式如下:
oIDL.ExecuteString(@".compile 'c:temptest.pro'");
oIDL.ExecuteString("test");
有些时候需要传递参数,IDL下要这么写:
IDL> .compile 'c:temptestfun.pro'
IDL> ;inFile是文件完整路径,如’c:temptest.dat’
IDL> r = testfun(inFile)
C#中调用的格式如下:
oIDL.ExecuteString(@".compile 'c:temptestfun.pro'");
// this.infile是完整文件路径,如’c:temptest.dat’
oIDL.ExecuteString("r=testfun('"+this.infile.ToString()+"')");
注意的是上面语句中的"r=testfun('"+this.infile.ToString()+"')"写法,应该要保证这句与IDL中的语句r = testfun(inFile)完全一致。
二、 源码路径过长或参数过长的问题
在传入的变量如文件名过长或参数过长时,C#调用时会出现自动截断的现象,这样导致程序运行报错,也算是混编调用的一个bug吧。解决是将需要直接传入的变量转换成不直接传入调用,即先调用C#的一段代码:
//传入的文件名和输出的文件名变量 string inFile= textBox_inputPath.Text; string outFileName = textBox_OutputPath.Text +"\" +fileName1 + "AutoGeo.img"; //文件名处理 int index=inFile.LastIndexOf("\"); string fileName=inFile.Substring(index+1,inFile.Length-index-1); //生成IDL下的调用格式 string exeStr = "roidata = auto_geoference('" + inFile + "','" + outFileName+ "')"; //调用自定义函数创建IDL源码pro文件 createProFile("AutoGeo",exeStr);
//调用初始化的com_idl_connect对象oENVIobj编译上面创建的IDL源码 oENVIobj.ExecuteString(".compile '" + MainForm.M_Envi_Path + "\EnviPro.pro'"); //执行AutoGeo功能 oENVIobj.ExecuteString("AutoGeo"); |
上面调用的createProFile函数的代码如下:
private void createProFile(string moduleName, string exeStr) { Stream dataSetStream = new FileStream( MainForm.M_Envi_Path+"\EnviPro.pro", FileMode.Create); StreamWriter sw = new StreamWriter(dataSetStream, System.Text.Encoding.GetEncoding("GB2312"));
string newStr = "pro " + moduleName + "n compile_opt strictarrn " + exeStr + "n end";
sw.WriteLine(newStr); sw.Close(); } |
C#中的createProFile执行后生成的pro文件的内容:
pro AutoGeo compile_opt strictarr roidata = auto_geoference('D:test_dataimage.tif','c:tempresult.img') end |
通过这种C#下创建IDL源码的方式,基本解决了C#调用IDL时出现的参数过长传递报错的情况。这种方法也适用于其他语言,如C++,basic等调用idl的情况。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-22 14:18
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社