c#调用dll里的方法
在.NET 4.0之后,CLR将会区别出一些异常(都是SEH异常),将这些异常标识为破坏性异常(Corrupted State Exception)。针对这些异常,CLR的catch块不会捕捉这些异常。SEH异常通常是非托管代码抛出的。
例如:调用c和c++的lib和dll库,都是非托管的。
在需要捕捉破坏性异常的函数外面加一个HandleProcessCorruptedStateExceptions属性,这个属性只控制一个函数,对托管程序的其他函数没有影响
2.透明代码
[SecurityCritical]
System.Security 命名空间提供公共语言运行时安全系统的基础结构,包括权限的基类。
SecurityCriticalAttribute Class指定代码或程序集执行安全性关键型操作。
通过反射能够获取有关类型和成员的信息,并能访问成员(即,调用方法和构造函数来获取和设置属性值,添加和移除事件处理程序,等等)。 使用反射可以获取有关类型的信息并且成员是不受限制的。 所有代码都可使用反射来执行以下任务:
-
枚举类型和成员,并检查其元数据。
-
枚举并检查程序集和模块。
与之相反,使用反射来访问成员会受到限制。 从 .NET Framework 4 开始,只有受信任的代码才能使用反射来访问关键安全成员。 而且,只有受信任的代码才能使用反射访问无法由已编译代码直接访问的非公共成员。 最后,使用反射访问关键安全成员的代码必须具有关键安全成员要求的任何权限,就像编译的代码一样。
具有一定的权限,代码可以使用反射来执行以下类型的访问:
-
访问不是安全关键的公共成员。
-
若这些成员不是安全关键,则访问可进入编译代码的非公共成员。 此类非公共成员的示例包括:
-
调用代码的基础类的受保护成员。 (在反射中,这称为系列级访问权限。)
-
调用代码的程序集中的
internal
成员(Visual Basic 中的Friend
成员)。 (在反射中,这称为程序集级别的访问。) -
包含调用代码的类的其他实例的私有成员。
-
3.提供从非托管DLL导出的函数的必要调用信息
//导入GDALAir.dll的aod计算函数
[SecuritySafeCritical]
[SecurityCritical]
[DllImport("GDALAir.dll", CallingConvention = CallingConvention.Cdecl)]
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。
DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。
a、CallingConvention 参数指示入口点的调用约定。如果未指定 CallingConvention,则使用默认值 CallingConvention.Winapi。