IDL与C#混合编程实现

转载请注明出处,谢谢!

首页保证先安装了IDL7.0环境。打开VS2008,新建C#项目,然后在工具箱中右键,选择项,找到COM组件中的IDLDrawWidget Control,打上勾。如图:

确定后工具箱中就会多出一个工具,将其拖放到窗体上


双击窗体,写窗体生成时的初始化IDL代码:

private void Form1_Load(object sender, EventArgs e)
        {
            int n;
            axIDLDrawWidget1.IdlPath = @"D:\Program Files\IDL7\IDL70\bin\bin.x86\idl.dll";
            n = axIDLDrawWidget1.InitIDL((int)this.Handle);
            if (n == 0)
            {
                MessageBox.Show("IDL控件初始化失败");
            }
        }

其中
D:\Program Files\IDL7\IDL70\bin\bin.x86\idl.dll 是自己安装IDL时的路径。待会我们提取相应的dll后就可以改掉这个路径。然后我们写一个运行IDL命令的函数,如下:

public int IDLEstr(string cmdstr)
        {
            int n;
            n = axIDLDrawWidget1.ExecuteStr(cmdstr);
            return n;
        }

然后我们放一个按钮,写上运行我们事先生成好的sav文件的代码:

private void button2_Click(object sender, EventArgs e)
        {
            string cmd = "@print";
            IDLEstr("Restore,'print.sav'");//编译程序
            IDLEstr(cmd);
        }

其中print.pro的代码如图:

生成sav文件的方法如图:

生成好sav文件后将sav文件考到我们的项目文件夹下面,与我们的exe文件在一起。
然后我们再放一个文本框,一个按钮,按钮事件写上运行文本框里面的IDL命令,代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            IDLEstr(textBox1.Text.ToString().Trim());
        }

OK,到这里就可以运行我们的程序了,如图:


下面我们装提取我们程序所须要的IDL系统文件,使程序脱离IDL环境也可以运行和使用。
提取其实很简单,到另一个环境去运行,然后程序提示少什么文件,就把什么文件拷过来就行了。我这里用另一种比较巧妙的方法。
我们运行我们的程序,然后到IDL系统目录bin.x86下面,也就是idl.dll文件所在的文件夹,然后我们全选,按删除键,确定删除,这时系统会提示有些文件不能被删掉,因为正在被我们的程序所使用,那么这些没能删掉的文件就是我们程序所须要的东西了,我们把它们拷出来。
照如此方法,相应也可发现我们还须要resource/fonts/hersh1.chr文件,还有就是licence/licence.dat文件。
最后列出所有须要文件的结构。

.exe
.sav
AxInterop.IDLDRAWX3Lib.dll
Interop.IDLDRAWX3Lib.dll
IDL\include\bin.x86\freetype2_1_3.dll
IDL\include\bin.x86\gl_driver.dll
IDL\include\bin.x86\idl.dll
IDL\include\bin.x86\MesaGL6_2.dll
IDL\include\bin.x86\MesaGLU6_2.dll
IDL\include\bin.x86\osmesa6_2.dll
IDL\include\bin.x86\ug3220.dll
IDL\resource\fonts\hersh1.chr
IDL\license.dat

最后程序完整代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace IDLTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int n;
            //axIDLDrawWidget1.IdlPath = @"D:\Program Files\IDL7\IDL70\bin\bin.x86\idl.dll";
            axIDLDrawWidget1.IdlPath = @"IDL\include\bin.x86\idl.dll";
            n = axIDLDrawWidget1.InitIDL((int)this.Handle);
            if (n == 0)
            {
                MessageBox.Show("IDL控件初始化失败");
            }
        }

        public int IDLEstr(string cmdstr)
        {
            int n;
            n = axIDLDrawWidget1.ExecuteStr(cmdstr);
            return n;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IDLEstr(textBox1.Text.ToString().Trim());
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string cmd = "@print";
            IDLEstr("Restore,'print.sav'");//编译程序
            IDLEstr(cmd);
        }
    }
}