asp.net C#调用托管DLL和非托管DLL文件的区别

asp教程.net c#调用托管dll和非托管dll文件的区别
托管dll文件,可以在dotnet环境通过 “添加引用” 的方式,直接把托管dll文件添加到项目中。然后通过 using  dll命名空间,来调用相应的dll对象 。

    非托管dll文件,在dotnet环境应用时,通过 dllimport 调用。

   c# 调用非托管dll文件。dll文件是用c语言编写的。
如下:
1:结构定义
  rditag_t  
  rditag_t结构定义了测点的结构
  typedef struct _rditag_t
  {
char tagname[rdi_max_tagname_len]; /*[in]*/
float val; /*[out]*/
int status; /*[out]*/
  } rditag_t;
  2:rditagname_t
  rditagname_t定义了测点名类型
  typedef char rditagname_t[rdi_max_tagname_len];
----------------------------------------------------
函数说明:
  1:void rdi_read(rditag_t tags[], int count, int timeout);
  参数
  tags 读取数据点数组。
  count 输入参数。
  timeout 输入参数。
  2: void rdi_read0(rditagname_t tagnames[], float values[], int statuses[], int count, int timeout);
参数
tagnames 输入参数。
values 输出参数。
statuses 输出参数。
count 输入参数。
timeout 超时值(毫秒)。
返回值
无。

    --以下是源码。及供参考学习。不能用于商业盈利。 
public const string dll_name = "rdiapi.dll";
  public const byte rdi_max_tagname_len = 0x18;
  public const int rdi_sts_failed = -1;
  public const int rdi_sts_invalid_handle = -2;
  public const int rdi_sts_invalid_tag = -5;
  public const int rdi_sts_net_error = -3;
  public const byte rdi_sts_ok = 1;
  public const int rdi_sts_timeout = -4;

  [dllimport("rdiapi.dll")]
  public static extern int rdi_close();
  [dllimport("rdiapi.dll")]
  public static extern int rdi_init();
  [dllimport("rdiapi.dll")]
  public static extern int rdi_isopen();
  [dllimport("rdiapi.dll")]
  public static extern int rdi_open(string server, int port);
  [dllimport("rdiapi.dll")]
  --用c#编写的函数(注意参数[in, out] rditag_t[] tags 而不是 ref )
  public static extern int rdi_read([in, out] rditag_t[] tags, int count, int timeout);
  [dllimport("rdiapi.dll")]
  public static extern int rdi_read0(rditag_t1[] tags, [in, out] float[] value_array, [in, out] int[] status_array, int count, int timeout);
  [dllimport("rdiapi.dll")]
  public static extern int rdi_uninit();
  -- 用c#定义结构
  [structlayout(layoutkind.sequential)]
  public struct rditag_t
  {
  [marshalas(unmanagedtype.byvaltstr, sizeconst = 0x18)]
  public string tagname;
  public float val;
  public int status;
  }
  -- 用c#定义结构 
  [structlayout(layoutkind.sequential)]
  public struct rditag_t1
  {
  [marshalas(unmanagedtype.byvaltstr, sizeconst = 0x18)]
  public string tagname;

 

时间: 2024-11-02 01:20:37

asp.net C#调用托管DLL和非托管DLL文件的区别的相关文章

有关c# 调用vc++编写的非托管DLL、socket编程等相关知识的讲的比较详细的书籍

问题描述 有关c# 调用vc++编写的非托管DLL.socket编程等相关知识的讲的比较详细的书籍 学习c# 调用vc++编写的非托管DLL.socket编程等相关知识的讲的比较详细的书籍都有哪些?(最好是基于VS2008的) 解决方案 c#调用非托管C++生成的dllc# 调用 C++ 非托管 DllC#调用非托管dll 解决方案二: 这样一个知识点,最好是 Baidu/Google 查找来解决 书上的内容,没有网络上的丰富

C# 托管内存与非托管内存之间的转换(结合Unity3d的实际开发)

1.c#的托管代码和非托管代码 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存,然而c#毕竟运行在c++之上,有的时候,(比如可能我们需要引入一些第三方的c++或native代码的库,在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供

c++.net 托管类封装非托管类

C++.net中非托管的代码虽然在托管里面可以直接使用,但是有时候却会被限制.比如当需要用托管里面的 ArrayList 存储一个非托管的对象的时候就需要用一个托管的类把这个非托管的类封装一下,其他的封装的原因我也没想到,刚开始接触c++.net,基本是需要什么学什么,我是这个原因才去封装的.   比如一个非托管的类如下 class serverInfo { public: serverInfo(); ~serverInfo(); string CSTR_DBIPADDRESS; //数据库ip

如何区别 托管资源 与 非托管资源 ??

问题描述 C#.NET里如何区别托管与非托管资源,以防止忘记释放某个非托管资源而导致内存爆满?我很困惑,尤其是数据库链接OleDbConnection或是SqlConnection这些Conn对象,是直接用.Dispose()就可以放心了呢还是必须.Close()和.Dispose()一起用才放心不会导致内存爆炸? 解决方案 解决方案二:实现IDisposable的类可以使用Dispose()方法释放其中的非托管资源也就是说如果你的类中用到如文件流网络链接等具有受保护的Finalize方法的类型

调用非托管dll常出现的bug及解决办法

C和C++有很多好的类库的沉淀,在.NET中,完全抛弃它们而重头再来是非常不明智的.也是不现实的,所以,我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll.就.NET中使用非托管的dll经验而言,经常碰到的问题至少有两个,它们都是通过在运行时抛出异常来体现的. 1.试图加载格式不正确的程序 出现这种异常,通常是.NET应用程序的"目标平台"与非托管dll的平台不一样. 一般,在使用VS开发.NET的应用程序和类库时,默认的目标平台为"Any CPU",

.net非托管资源的回收方法_实用技巧

本文实例讲述了.net非托管资源的回收方法,分享给大家供大家参考.具体分析如下: 释放未托管的资源有两种方法   1.析构函数 2.实现System.IDisposable接口   一.析构函数  构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数.析构函数初看起来似乎是放置释放未托管资源.执行一般清理操作的代码的最佳地方.但是,事情并不是如此简单.由于垃圾回收器的运行规则决定了,不能在析构函数中放置需要在某一时刻运行的代码,如果对象占用了宝贵而重要的

.NET简谈互操作(四:基础知识之Dispose非托管内存)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用)  .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.前一篇文章中我们学习了基础知识中的DllImport关键特性:我们继续学习基础知识中的内存释放相关技术

.Net托管资源非托管资源垃圾回收的疑问

CLR为开发者提供了一个非常让人激动的功能--垃圾回收.但是园子里关于垃圾回收的讨论,大多是讨论垃圾回收的原理,以及Dispose模式.但是垃圾回收在实际使用时,是不是可以达到其设计的目标,在开发过程中有没有需要注意的问题呢?本人也不是非常明确,这篇文章希望能达到抛砖引玉的效果,希望个人牛人能够给本人或同样存在疑惑的人一个清楚明确的答案. 什么是垃圾回收?就是说你在使用CLR的时候(不包含托管资源) ,只需要new一个对象使用.而不需要通过程序代码进行释放对象(以上是本人理解的垃圾回收的意义).

.net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃?

问题描述 .net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃? 有一个.net服务,服务中开了多线程.其中有一线程会去调用非托管C++DLL,并阻塞等待其返回值.其他线程同步做文件处理.数据状态更新等操作.现在调用非托管C++DLL的线程会因为非托管代码的问题,崩溃.这样整个服务也就崩溃了!需要人工去服务器上重启该服务!请问:如何防止整个服务崩溃?是否可以捕获非托管C++中的错误.因为已经try catch了,但什么都捕获不到,直接服务崩溃! 解决方案 这个应该要想办法解决C++