EasyPR_Dll.dll C#调用方法,用过的大神给指点下,不胜感激!
这个跟普通的dll调用一样的道理吧。引入到Bin目录下。引用命名空间。调用对应的方法。
这个DLL是用C++写的,得用Dllimport引用,不会写引用函数及对应的c#变量!
动态dl和1楼说的一样,静态的不行,注意以下几点(我以前看到的,后面一直保存着):
1、C++中有指针,C#中需要使用指针吗?
由于C++中的动态库中有指针参数,因此我也是用.NET的不安全代码,使用了C#的指针,但是最后也还是出现了一些问题,如在C#中传入的参数是一个二维数组时就出现了问题,这个问题我在网上找了好多资料也没有解决,最后和c++程序员商量了下改变了传入参数的参数类型。最后也没有使用指针。
2、C#和C++中的类型如何转换呢?
虽然C#和C++比较类似,但是其给我们的参数类型我们要与C#的参数类型一一对应起来,因此我找了一些资料把其类型一一对应了,具体看后续说明。
3、C++写好的动态库放到那个位置呢?
关于C++动态库的位置也是个问题,在应用中我们使用了相对路径和绝对路径进行测试,有的发现在VS中可以调用到,但是发布后发现无法调用到动态库,最后只要把动态的dll放到系统的目录system32下面才解决了改问题,目前还没找到其他的方法,如有其他的更好方法还请大家指点。
4、如何反编译C++的dll的名称,端口?
可以通过Dependency Walker工具进行反编译查看别人写的动态库的信息
5、还有其他的一些细节,如C#调用动态库需要指定其编码、代码写法等等
public class TestDLL
{
[DllImport(@"SomClient.dll", EntryPoint = "CreateSomClient", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern UInt32 CreateSomClient(String hostIp, UInt16 port);
[DllImport(@"SomClient.dll", EntryPoint = "ReleaseSomClient", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern void ReleaseSomClient(ref UInt32 clientHandle);
}
参数说明:
EntryPoint 指定要调用的 DLL 入口点。
CharSet 控制名称及函数中字符串参数的编码方式。默认值为 CharSet.Ansi。
ExactSpelling 是否修改入口点以对应不同的字符编码方式。
CallingConvention 指定用于传递方法参数的调用约定。默认值为 WinAPI。该值对应于基于32位Intel平台的 __stdcall。
BestFitMapping 是否启用最佳映射功能,默认为 true。最佳映射功能提供在没有匹配项时,自动提供匹配的字符
过去俩月了 几个问题以前遇到过 说一下我的解决方法
1. 指针问题:这个根据C++函数的参数不同分两种情况,一个对象的指针和一块内存的指针。对象指针比较好解决,如果是引用类型直接传,值类型需要加上ref。内存指针的话,先使用Marshall.SizeOf()获取参数对象的大小,再使用Marshall.AllocHGlobal()分配内存,然后传入获得的IntPtr变量。
2. 提醒一下,要注意C++中那些带长度的变量。
3. dll路径:我也做了问题中提到的尝试,后来发现将dll相对路径声明为一个string常量,在DllImport中传入该常量即可。如代码:
public class TestDLL
{
private const string dllPath = "SomClient.dll";
[DllImport(dllPath, EntryPoint = "CreateSomClient", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern UInt32 CreateSomClient(String hostIp, UInt16 port);
}
发布时将该dll放在程序同级目录下(放的位置取决于dllPath的路径)。
45没什么研究就不说了。 详细的看这里 http://www.cnblogs.com/zaiyuzhong/p/Csharp-package-Cplusplus-dll.html
@在风里: 实践出真知
顶一下