拖管程序调用非拖管API
一,在.Net 2005中使用拖管C++调用非拖管的动态链接库
现在编写动态库的时候就没法使用头文件来调用了,而且在要导出的方法前加入extern "C"来说明一下,extern "c"是用c语言的一些连接规则,可以防止c++编译器对被连接的函数进行名字粉碎。也可以叫做是函数方法的入口,头文件就可以不要了;
1》Dlltest.cpp代码如下:
#define FLSManagement_API _declspec(dllexport)
extern "C" FLSManagement_API int add(int a,int b)
{
return a+b;
}
2》在.Net 2005中新建一个ASP.NET Webservice命名为testWeb先生成一次,这里要注意的是,要将1》中生成的Dlltest.dll拷贝到testWeb的运行目录的Bin下,默认一般在C:\Inetpub\wwwroot中,在testWebClass.h中,代码如下:
首先引入一个命名空间
using namespace System::Runtime::InteropServices;
在类中加入如下代码
[DllImport("Dlltest.dll", EntryPoint = "add", SetLastError = true,
CharSet = CharSet::Unicode, ExactSpelling = true,
CallingConvention = CallingConvention::StdCall)]
static int getResult(int a, int b);
在testWebClass.cpp中,这里就可以在生成的HelloWorld方法中加入如下代码:
int i = 0;
try{
i = getResult (5,3);
}catch(Exception^ e){
e->Message;
}
String^ str = i.ToString();
return str;
编译运行后就可以的到正确的结果了。测试完成。
二,拖管的窗体程序中读取app.config配置文件
在用C#建的窗体程序,试了好多方法,怎么读怎么可以,但是一到了拖管下面就不行了,好像着了魔一样,就是读不出来,在网上找了好多资料,都说那些方法就是那样用的,什么引用,什么命名空间都正确了,可是还是读不出来。后来我把C#根目录下的那个App.config文件删了,发现居然还能读出来。也就是这样才找到了原因,原来,读的是debug目录下的xx.exe.config文件,问题的关键也就在这里了,.NET中用C#生成的窗体程序会自动将需要的配置文件按与应用程序名字相同的前缀将App.config打包放到生成的.exe目录下(假如应用程序名为xxx),而拖管的不会做这一步事。只要手动把拖管下的App.config文件拷贝到debug目录下,重命名为与应用程相同的前缀(xxx.exe.config)就可以了,这里与webservice不同;
读取的方式和很多种,用的比较多的是引用using namespace System::Configuration;
String^ ConnectionString = ConfigurationManager::AppSettings["strDbConnect"];
三,webservice中调用外部应用程序
在webservice被访问的时候,调用一个外部的应用程序,而且如果有一个实例在运行,则不会再调用
using namespace System::Diagnostics;
array<Process^>^ ru = Process::GetProcessesByName("FLSOperate");
if(ru->Length < 1)
{
Process^ p = gcnew Process();
ProcessStartInfo^ psinfo = gcnew ProcessStartInfo();
//psinfo->CreateNoWindow = true;
psinfo->FileName = "C:\\Inetpub\\wwwroot\\test1111\\bin\\FLSWebOperate.exe";//"cmd.exe"; //notepad
//psinfo->UseShellExecute=true;
psinfo->WindowStyle=ProcessWindowStyle::Maximized;
p->StartInfo = psinfo;
//Process::Start(psinfo);
p->Start();
}
有一个问题(还没有解决)在webservice中调用.exe,资源管理器中可以看到运行的进程(如FLSWebOperate)但是窗体出不来,同样的应用程序,如果使用别的应用程序调用的话,窗体出来的非常正常;还没找到原因,以及解决办法。