C# 如何使用C++;来自C的dll#

C# 如何使用C++;来自C的dll#,c#,c++,.net,dll,C#,C++,.net,Dll,我尝试在C++项目中包含C++库(DLL),但每次我都会在VS2012/中得到以下错误消息 A reference to 'C:\Users\HiepDang\Desktop\mydll.dll' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. 当我尝试添加Com+组件时,我在窗口中收到以下错误消息 一个或多个文

我尝试在C++项目中包含C++库(DLL),但每次我都会在VS2012/

中得到以下错误消息

A reference to 'C:\Users\HiepDang\Desktop\mydll.dll' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.
当我尝试添加Com+组件时,我在窗口中收到以下错误消息

一个或多个文件不包含组件或类型库。无法安装这些文件

出现错误80110425

发生未知错误。您应该检查所有文档以获得解决方案。如果没有更多信息,请联系技术支持

我在遵循这个思路,但我的问题没有解决

在C++中,我可以使用类似于dll的:
    //Header
    extern "C" __declspec( dllimport ) int mymethod(const char *key, char *data, size_t buflen);
    
    //Code test
    const char* key = "test";

    char* data = new char[1024];
    int buflen = 1024;
    int result = mymethod(key,data, buflen);
在C#中,我使用dll作为:

    //define dll
    [DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern int mymethod([MarshalAs(UnmanagedType.LPTStr)]string key, [MarshalAs(UnmanagedType.LPTStr)]string data, uint buflen);

    //method test
    private static int testdll() 
    {
        string key = "123456789";
        string buf = string.Empty;
        mymethod(key, buf, 1024);
        return 0;
    }
你能告诉我解决这个问题的办法吗

我的英语不好。如果有什么不方便的事,我很抱歉

编辑:我解释了dll中方法中的变量。“密钥”由于字符串输入有8-13个字符,mymethod将被加密以生成“buf”。我需要变量“buf”。

在C#您必须使用
StringBuilder()

请注意,
size\u t
的大小是
IntPtr
,因为它在x86上是4字节,在x64上是8字节。

在您的cpp项目中, 改变

并将生成的cpp dll文件“mydll.dll”复制到C#项目的outdir

顺便说一下,如果第二个参数数据不是字符串而是原始二进制数据,那么最好使用byte[]而不是char*

[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int mymethod([MarshalAs(UnmanagedType.LPTStr)]string key, byte[] data, uint buflen);
字节数组自动编组

像下面那样使用它

var key = "A key";
var data = new byte[10];
//fill data
mymethod(key, data, (uint)data.Length);

另外,由于我的DLL是非托管的(意味着它是一种非托管语言,如C或C++),因此根据DllImport的规范,“表示属性化方法由非托管DLL作为静态入口点公开”。为什么我不能使用这个“DllImport”?
如果它是C++ COM对象,如果您登记了ReGVR32,则可以在VisualStudioCOM引用选项卡中添加对DLL的引用,并且VisualStudio通常创建一个DLL(我想它称为运行时可调用包装),您可以看到它是用NAMEOFFRORBAR.IOP.DLL创建的。因此,如果MyExecRefsDll.dll是com对象,则它将成为myexerefs.Interop.dll。但是,当您添加引用时,VisualStudio通常会在托管代码中自动为您执行此操作。如果在C++中使用ATL模板创建C++ DLL作为COM对象,那么从DoNET中访问更容易(IAM引用来自另一个DLL文件的DLL的非托管C++代码)。(没有从第二个dll复制的代码,我只引用tlb、库、dll文件,visual studio执行其他所有操作。

如链接所述,使用
DllImport
。不要试图通过右键单击引用并选择add来添加引用。只需使用现有的
DllImport
c#code@MickyDuncan:谢谢你的回复。但是C#cod我发布的e不符合我的要求。当mymethod调用时,“buf”的值必须更改。按照C代码,我只收到一条错误消息,“key”的值无效”这是在键的变量不够8个字符时发生的。更新你的问题以反映这些新的要求。请在运行代码时把错误的全部异常信息放在一起。它将帮助我们区分什么是你的问题。@ M.Madiip:没有例外的错误发生在C++代码中。key=“123456789”,我得到buf=“2995796360”。如果key不在8-13个字符之间,则必须得到mesage:“key”的值无效”。所有消息返回都由其他人定义。使用C#Code,当我使用key=“123456789”调用方法时,我收到一条消息,如key不在8-13个字符之间。感谢您的解决方案。我必须遵循,但仍然出现错误。@HiepDang您必须将
.dll
放在
.exe
的同一文件夹中,并且您必须知道
.dll
是以32位还是64位编译的。然后将C#项目设置为Properties->B如果DLL为64位,DLL为32位,X64为平台目标。MyDLL为32位,则我也设置平台目标X86。我想我必须使用C++/CLI来解决这个bug。谢谢帮助!我已经解决了我的问题。我已经编辑了你的代码来改进答案。谢谢!不像你想的。C++中使用的CPP代码片段,我和Visual C++都有。它不能很好地工作。但是我想在C#中使用mydll.dll,我不知道怎么做?
extern "C" __declspec( dllexport )
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int mymethod([MarshalAs(UnmanagedType.LPTStr)]string key, byte[] data, uint buflen);
var key = "A key";
var data = new byte[10];
//fill data
mymethod(key, data, (uint)data.Length);