admin 管理员组

文章数量: 1184232


2024年3月9日发(作者:有什么基础才能学vue)

C#_DllImport用法和路径问题

DllImport是pServices命名空间下的一个属性类,其功能是提供

从非托管DLL导出的函数的必要调用信息。

DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。

DllImport的定义如下:

[AttributeUsage()]

publicclassDllImportAttribute:ute

{

publicDllImportAttribute(stringdllName){…}//定位参数为

dllName

publicCallingConventionCallingConvention;//入口点调用约定

publicCharSetCharSet;//入口点采用的字符接

publicstringEntryPoint;//入口点名称

publicboolExactSpelling;//是否必须与指示的入口点拼写完全一

致,默认false

publicboolPreserveSig;//方法的签名是被保留还是被转换

publicboolSetLastError;//FindLastError方法的返回值保存在

这里

publicstringValue{get{…}}

}

用法示例:

[DllImport("kernel32")]

privatestaticexternlongWritePrivateProfileString(string

section,stringkey,stringval,stringfilePath);

以上是用来写入ini文件的一个win32api。

用此方式调用Win32API的数据类型对应:DWORD=int或uint,BOOL=bool,预定义

常量=enum,结构=struct。

DllImport会按照顺序自动去寻找的地方:

1、exe所在目录

2、System32目录

3、环境变量目录

所以只需要你把引用的DLL拷贝到这三个目录下就可以不用写路径了或者可以这样

h(.bin*.dll)

Web中的,同时也是应用程序中的

后来发现用[DllImport(@"C:")]这样指定DLL的绝对路径就可以正常装

载。

这个问题最常出现在使用第三方非托管DLL组件的时候,我的也同样是这时出的问

题,m的官方解决方案如下:

首先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用

的需要引用,间接使用的需要拷贝到bin目录下.非托管的处理

会比较麻烦.实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,

然后在那运行web,而CLR只会拷贝托管文件,这就是为什

么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了.

具体做法如下:

1、首先我们在服务器上随便找个地方新建一个目录,假如为C:DLL

2、然后,在环境变量中,给Path变量添加这个目录


本文标签: 托管 入口 目录 调用 方法