我是新来的C#和也是在一般的C ++程序使用C ++库。 我从C ++代码,我相信这是一个“托管”代码为DLL的名称是“TestManaged.dll”建立了一个DLL。 我不是100%肯定,如果DLL / C ++代码托管/非托管。
我想用类和这个DLL的方法在我的C# windows forms application
代码。 有多个类在此DLL。 当我在chekced这些类中,这些类和方法Object Browser
,他们都有Public
标识。
到目前为止,我已经加入这个DLL我的C#应用程序代码引用。 有三类我会在我的问题谈: Product
, ReqStatus
, ProductData
。 我可以创建关于各种类此DLL如下的一个对象(或多个)。
Product testCall = new ProductClass();
还有一种叫类ProductData
在此DLL中,我能得到C ++代码,这个类如下。 在这种情况下, ProductData
被示为类Object Browser
在C#作为在那里它实际上是在C ++代码一个结构。 我不知道是否回答我的问题(在末尾),这是非常重要的。
下面是一个C ++代码定义ProductData
结构- ProductData.h
文件。
#ifdef WIN32_MANAGED
public ref struct ProductData
#else
struct ProductData
#endif
{
UINT32 ProductId; //!< Product ID
UINT32 PRoductRev; //!< Build Revision
};
下面是一个C ++代码定义ReqStatus
枚举- ReqStatus.h
文件。 我有没有指定的标识符创建的同一个枚举在我的C#代码。
enum ReqStatus
{
SUCCESS, //!< Method was successful
//Connection errors
NOT_CONNECTED, //!< Connection not open
CONN_TIMEOUT, //!< Connection timed out commuincating with device
};
现在,有两种方法我想打个电话有两个问题:
方法1:是一个getProductData
内部方法Product
类,它接受的对象ProductData
类型作为参数并返回ReqStatus
这是在C ++枚举类型。 所以以下是声明gerProductData
方法(如见于Object Browser
):
public ReqStatus getProductData(ProductData data)
同样的方法的C ++ delcaration是:(实际的方法是太长,因此只是给报关):此方法是内部Prodcut.cpp
文件
ReqStatus Product::getProductData(ProductData PLATFORM_PTR data)
PLATFORM_PTR被定义为下面Platform.h
#ifdef WIN32_MANAGED
#define PLATFORM_PTR ^
#else
#define PLATFORM_PTR *
#endif
方法2:是一个getConnected
内部方法Product
类,它接受的字符阵列(我不知道这个问题)和的目的ProductData
类型作为参数并返回ReqStatus
这是在C ++枚举类型。 所以以下是声明getConnected
方法(如见于Object Browser
):
public ReqStatus getConnected(sbyte* someChar, ProductData data)
同样的方法的C ++ delcaration是:(实际的方法是太长,因此只是给报关):此方法是内部Prodcut.cpp
文件
ReqStatus Product::getConnected(const char *someChar, ProductData PLATFORM_PTR data)
C ++代码调用方法如下:
private : Product^ _testProduct;
testProduct = gcnew Product();
ProductData ^ data = gcnew ProductData();
int portNum = Decimal::ToInt16(7);
char portName[32];
_snprintf(&portName[0], sizeof(portName),"COM%d", portNum);
ReqStatus status = _testProduct->getConnected(&portName[0], data); //Calling getConnected
还有就是内部通话getProductData
里面方法getConnected
方法。
ReqStatus status = getProductData(data); //data is the same which was passed to the getConnected method
我的C#代码如下,我在这两个方法调用了错误:我已经把错误在下面的代码片段在同一行。 这两种方法是独立的。 它只是在getProductData
从所谓getConnected
在C ++代码的方法。 我想检查我是否可以单独通话双方。
ProductData pData = new ProductData(); // OK
Product _testProduct = new Product(); // OK
ReqStatus status1 = _testProduct.getConnected("COM5", pData ); //Error 1: The best overloaded method getConnected has some invalid arguments
ReqStatus status2 = (ReqStatus)_testProduct.getProductData(pData ); // Error 2: Method is inaccessible due to its protection level
对于错误1,我试图从StackOverflow上和其他论坛,但各种物品的解决方案,解决不了它。 只是一个参考,我试图改变“SomePortCOM”如下,但它din't工作。
更新 : 此代码工作正常,现在我没有看到错误1(无效参数)。 现在,我只需要摆脱错误2(防护等级误差)。 请提供任何建议。 谢谢。
String str = "COM5";
byte[] bytes = Encoding.ASCII.GetBytes(str);
unsafe
{
fixed (byte* p = bytes)
{
sbyte* sp = (sbyte*)p;
//SP is now what you want
ReqStatus status1 = _testProduct.getConnected(sp, pData );
}
}
对于误差2,我搜索了这么多的博客,发现可能的解决方案之一可能是使用的DllImport的,我想,也和我有以下问题:
dllimport的C#的声明:
[DllImport("TestManaged.dll",EntryPoint="getConnected")]
public static extern ReqStatus getConnected(String SerialPort, ref ProductData pData);
我从我的C#代码如下调用此函数:
ProductData pData = new ProductData();
String str = "COM7";
ReqStatus status1 = getConnected(str, ref pData);
但是,我越来越Entry point not found
错误。 我试图运行DUMPBIN函数来获取这个DLL导出的函数列表。 但是,我没有看到任何功能。 更确切地说只是一个随机的输出如下。
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:\Rumit\TestManaged.dll
File Type: DLL
Summary
2000 .data
22000 .rdata
1000 .reloc
1000 .rsrc
13000 .text
更新:另外,我没有看到通过Dependency Walker中该DLL的任何方法。 现在,我已经得到了C ++源代码。 但我是相当新的C ++编码。 在任何情况下,需要改变到C ++代码,请给方向。
问候,Rumit