当前位置:编程学习 > C#/ASP.NET >>

C#调用c写的dll

C的函数原型是:int LTM8901DC(char* portNumber , int baudrate, int address, double* temperature, double *humidity)

[DllImport("LTM8901DC.dll", CharSet = CharSet.Auto)]
        public static extern int LTM8901DC(string portNum, int bandrate, int address, double temp, double humidity);

这样是不是不行啊?我是不是传个引用才行啊?
有人搞过么,和C的指针对应的参数???
我刚开始用c#,还没啥经验 --------------------编程问答-------------------- 这样声明试试

[DllImport("LTM8901DC.dll")]
public static extern int LTM8901DC (string portNumber,int baudrate,int address,ref double temperature,ref double humidity);
--------------------编程问答--------------------

using System.Runtime.InteropServices;
[DllImport("asitedll.dll")]

static extern int AS_Init(string url, string userID, string groupID, string roleID, string key);

 richTextBox1.Text = AS_Init("http://192.168.100.51/vrweb", "superadmin", "OEMGroup", "OEMUsers", "123456").ToString()
--------------------编程问答-------------------- 我这样声明的
public class TestCallC_dll
    {
        [DllImport("LTM8901DC.dll", CharSet = CharSet.Auto)]
        public static extern int LTM8901DC(string portNum, int bandrate, int address, ref double temp, ref double humidity);
    }
这样调用的,
 mResult = TestCallC_dll.LTM8901DC("COM6", 9600, 0,ref tem, ref hum);
但还是不行

--------------------编程问答-------------------- 怎么不行。提示是什么?调试程序也还会返回个错误呢。你提问都不说错误信息别人如何能知道你的问题? --------------------编程问答-------------------- “DllTest.exe”: 已加载“C:\WINDOWS\system32\MSCTFIME.IME”,未加载任何符号。
“DllTest.exe”: 已加载“C:\WINDOWS\system32\SogouPy.ime”,未使用调试信息生成二进制文件。
“DllTest.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.6001.22319_x-ww_f0b4c2df\GdiPlus.dll”,未加载任何符号。
“DllTest.exe”: 已加载“C:\WINDOWS\system32\mslbui.dll”,未加载任何符号。
“DllTest.exe”: 已加载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”,未加载任何符号。
“DllTest.exe”: 已卸载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”
“DllTest.exe”: 已加载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”,未加载任何符号。
“DllTest.exe”: 已卸载“D:\ctbri-live22\DllTest\DllTest\bin\Debug\LTM8901DC.dll”
“DllTest.exe”(托管): 已加载“C:\WINDOWS\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_zh-CHS_b77a5c561934e089\mscorlib.resources.dll”,未加载符号。
在 System.DllNotFoundException 中第一次偶然出现的“DllTest.exe”类型的异常
线程 'Win32 线程' (0x11b8) 已退出,返回值为 0 (0x0)。

到底访问到我的dll了没有啊????我不太懂 --------------------编程问答-------------------- [DllImport("LTM8901DC.dll", CharSet = CharSet.Auto)]
public static extern int LTM8901DC(string portNum, int bandrate, int address, IntPtr temp, IntPtr humidity);

调用需要用到unsafe code,并将double型声明为指针!
unsafe{
     double temp = 10.0;
    double *pTemp = &temp;
}
传pTemp即可。 --------------------编程问答-------------------- 你发了两个帖子? --------------------编程问答--------------------
引用 1 楼 wuyazhe 的回复:
这样声明试试

C# code

[DllImport("LTM8901DC.dll")]
public static extern int LTM8901DC (string portNumber,int baudrate,int address,ref double temperature,ref double humidity);

首先很同意这个方法,
调不到可能是你需要把这个dll文件放在debug文件夹里。 --------------------编程问答-------------------- 估计是dll问题。提几个建议
extern "C" int __declspec(dllexport)HookException();
我猜测有几个原因,楼主请参考
1.vc里面写的导出函数,如果不加"C"进行导出,那么导出函数名称将不是原来的名称,请楼主检查。
2.在dll中BOOL APIENTRY DllMain( HMODULE hModule,
  DWORD ul_reason_for_call,
  LPVOID lpReserved{
CGlobal* glb = CGlobal::GetInstance();
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
glb->_ExceptionCounter = 0;

glb->_lpContext = new CVehLogContext(hModule);

glb->_lpLogWriter = CLogWriterFactory::GetILogWriter(glb->_lpContext);

SetExceptionHash();

glb->_lpVeh = new CVeh();

glb->_lpDbgHelp = new CDbghelp();
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;

case DLL_PROCESS_DETACH: 
glb->~CGlobal();
break;
}
return TRUE;


请注意没一个case,都要使用break,否则loadlibrary时候获取不到模块句柄。

3.另外的问题采用 ref double解决,也可以传个指针intptr
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,