Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将外部依赖项添加到C++;DLL文件 我在MV C++ 2012内部创建了一个DLL,当我使用 Dumpbin /Exports filename_C#_C++_Cmd - Fatal编程技术网

C# 将外部依赖项添加到C++;DLL文件 我在MV C++ 2012内部创建了一个DLL,当我使用 Dumpbin /Exports filename

C# 将外部依赖项添加到C++;DLL文件 我在MV C++ 2012内部创建了一个DLL,当我使用 Dumpbin /Exports filename,c#,c++,cmd,C#,C++,Cmd,DLL文件中的函数名内部有一个等号。我不得不使用公共语言运行时支持(/crl),因为我使用了C#的DLL。这就是函数名显示为等号的原因吗?我的头文件: #ifdef ColorDLL_EXPORTS #define ColorDLL_API __declspec(dllexport) #else #define ColorDLL_API __declspec(dllexport) #endif extern "C"{ ColorDLL_API int ColorSelect(int i); }

DLL文件中的函数名内部有一个等号。我不得不使用公共语言运行时支持(/crl),因为我使用了C#的DLL。这就是函数名显示为等号的原因吗?我的头文件:

#ifdef ColorDLL_EXPORTS
#define ColorDLL_API __declspec(dllexport)
#else
#define ColorDLL_API __declspec(dllexport)
#endif

extern "C"{
ColorDLL_API int ColorSelect(int i);
}
ColorDLL.cpp

#include "stdafx.h"
#include "ColorDLL.h"
#using <ColorDiologeClass.dll>

extern "C"{
ColorDLL_API int ColorSelect(){
ColorDiologeClass::Class1::ColorReturn(1);
return 1;
}

为什么会这样?我希望它显示为ColorSelect,而不是ColorSelect=\u ColorSelect。如果我这样做,我将如何从一个像JMP这样需要确切函数名的程序中调用这个函数?是彩色的吗?或者是ColorSelect=\u ColorSelect?

名称为“mangled”-返回类型和参数包含在函数名称中。如果您不希望这样,可以在函数名之前(或函数块周围)使用
extern“C”

> P>这将是名称的Fungle,它是C++的遮盖特性,允许它支持函数重载(因为它将函数的参数类型合并到其名称中)。 这一点更为详细。

微软称之为“装饰”,而不是破坏。它们包括一个名为“undname”的命令行工具,该工具将根据修饰名称生成原始名称:

C:\>undname ?ColorSelect@@YAHXZ
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?ColorSelect@@YAHXZ"
is :- "int __cdecl ColorSelect(void)"
如果您想在自己的代码中执行相同的操作,也可以使用

值得一提的是,装饰/损坏不仅支持重载,而且还支持。类型安全链接源于函数重载,尽管它本身并不是真正的函数重载

特别是,类型安全链接处理(例如)如何处理C++代码,它有过载,例如,代码> SqRt>代码> <代码>浮点<代码>,代码>双代码/代码>,代码>长双< /代码>,也可能是代码>复合体< /代码>,但链接到提供了<代码>双Sqt(double)< /C> >的C库,而不是其他重载。在这种情况下,我们通常希望在使用正确的参数时使用它,而不是在其他情况下

即使不涉及函数重载,也可能发生这种情况。例如,在纯C中,可以执行以下操作:

#include <stdio.h>
extern int sqrt(int);

// ...
printf("%d", sqrt(100));
#包括
外部内部sqrt(内部);
// ...
printf(“%d”,sqrt(100));
现在,我们已经告诉编译器我们正在使用一个版本的
sqrt
,它接受(并返回)一个
int
。不幸的是,链接器没有意识到这一点,因此它仍然与标准库中的
sqrt
链接,该库获取并返回
double
。因此,上面的代码将打印一些完全无用的结果(通常是
0
,这并不重要)

类型安全链接防止了这种情况——即使它不是函数重载,我们仍然有两个同名的函数,但在链接时类型不同。通过将参数类型编码到名称中,链接器可以像编译器一样对其进行排序


当不同库之间存在名称冲突时,在C中也可能(而且经常)出现同样的情况。对于传统的C编译器,纠正这种混乱可能非常困难(最多)。使用C++编译器,除非两个库使用的名称相同,而且参数和类型相同,这决不是问题。< /P>不要修复它,这是一件好事。当你改变C++代码时,它就防止C程序死亡。只需在[DllImport]属性中使用EntryPoint属性。再说一次,当您使用/clr编译时,根本不需要这样做。只需创建一个公共ref类。为函数创建一个公共类,它就会修复装饰?你说不要修复它。但是如果MV是修饰的,我怎么能在MV之外使用这个函数呢?所以最终的目标是在JMP中调用它,它需要确切的函数名。我可以使用原始函数名吗?或者它作为修饰名存储在DLL中?@user1334858:它作为修饰名存储在DLL中。我尝试在头和.cpp中使用外部“C”,它摆脱了修饰。它现在看起来像这样的名称:ColorSelect=\u ColorSelect,但我希望它看起来像名称:ColorSelect您知道如何摆脱=_ColorSelect@user1334858:您不能-这是C语言命名约定的一部分(对于此编译器)。
#include <stdio.h>
extern int sqrt(int);

// ...
printf("%d", sqrt(100));