社区首页 >问答首页 >C++/C#解决方案中不可用的任何CPU

C++/C#解决方案中不可用的任何CPU
EN

Stack Overflow用户
提问于 2015-02-02 14:36:00
回答 2查看 13K关注 0票数 18

我有一个包含C#和托管C++项目的解决方案。它在解决方案平台x64和x86中编译。因为它是托管的,所以我想创建一个“任何C++”的解决方案,并摆脱旧的解决方案。

我将C++项目链接器设置更改为强制x64和x86的安全IL图像。

接下来,使用Configuration Manager,我创建了一个新的解决方案平台,名为“Any CPU”。接下来,我添加了一个项目平台,也称为“任意CPU”。

我继续将所有的C#项目设置为'Any CPU',但是对于C++我不能这么做。项目平台“Any CPU”不在下拉列表中,也没有“New...”选项。

VS是对它的补充,所以我保持了它的原样,并开始构建。令我惊讶的是,结果DLL (来自C++项目)是MSIL,尽管C++的平台是x64。编译x32时也会发生同样的情况,生成的DLL是MSIL格式的。

怎么回事?为什么我不能将C++项目设置为'Any CPU'?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-03 04:39:20

据我所知,您不能在Visual Studio中为C++/CLI项目创建"AnyCPU“项目类型。但是,您可以配置您的C++/CLI项目(在"Win32“项目类型下),使其编译为纯、安全的MSIL,而无需目标平台。这样做将允许您的C++/CLI程序集与"AnyCPU“C#项目一起使用。也就是说,它实际上是"AnyCPU",即使这不是它在配置管理器中的实际名称。

在"C/C++“项目设置中:

Safe MSIL Common Language RunTime Support (/clr:safe)

  • 公共语言RunTime的支持

在"Linker“项目设置中:

  • CLR镜像类型:只需确保未显式设置为IJWPURE

即可

备注:

  • 通过使用“安全”项目类型,一些似乎影响平台类型的编译器和链接器选项将被忽略。也就是说,您不必将所有内容都设置为非特定的平台类型。就是上面这几个。但你可以将其他选项设置为适当的选项,如果这会让你感觉更好的话。:)
  • "Safe“将阻止使用指针。如果这是一个重要的问题,显然是可以做到的,尽管有一个更复杂的过程。参见用于details.
  • Don't的Creating a pure MSIL assembly from a C++/CLI project?忘记在默认情况下,Visual Studio将创建C#项目,即使它们是"AnyCPU“的,即使它们在64位操作系统上执行,也将作为32位进程启动。如果依赖项是x86而不是预期的纯/安全MSIL,这可以隐藏平台不匹配问题。只需注意一些事情(您可以通过取消选中C#项目“构建”项目属性页面中的“首选32位”选项来控制这一点)。
票数 16
EN

Stack Overflow用户

发布于 2016-11-22 17:32:02

为了让C++动态链接库使用C#功能,C++项目必须生成动态链接库的x86和x64版本。不能仅从使用AnyCPU设置编译的C# dll中引用x86或x64 dll。

让AnyCPU动态链接库使用C++动态链接库的诀窍是,在运行时确保程序集无法加载C++动态链接库,然后订阅AppDomain AssemblyResolve事件。当程序集尝试加载dll但失败时,您的代码有机会确定需要加载哪个dll。

订阅事件如下所示:

代码语言:javascript
代码运行次数:0
复制
System.AppDomain.CurrentDomain.AssemblyResolve += Resolver;

事件处理程序如下所示:

代码语言:javascript
代码运行次数:0
复制
System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args)
{
     string assembly_dll = new AssemblyName(args.Name).Name + ".dll";
     string assembly_directory = "Parent directory of the C++ dlls";

     Assembly assembly = null;
     if(Environment.Is64BitProcess)
     {
            assembly = Assembly.LoadFile(assembly_directory + @"\x64\" + assembly_dll);
     }
     else
     {
            assembly = Assembly.LoadFile(assembly_directory + @"\x86\" + assembly_dll);
     }
     return assembly;
}

我已经创建了一个简单的项目,演示如何从AnyCPU动态链接库访问C++功能。

https://github.com/kevin-marshall/Managed.AnyCPU

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28280101

复制
相关文章
this 指向4 — 事件处理函数中的 this
本文继续讨论 this 指向 问题,今天讨论: 事件处理函数中的 this 文末尾有关于this的面试题,可直接查看 0 1 事件处理函数中的 this 示例1: <button id="btnTest" onclick="console.log(this)">Test</button> <button id="btnTest2" onclick="(function(){console.log(this)})()"> Test2</button> 点击结果为: 示例2: //场景1 let
用户9914333
2022/07/22
8460
this 指向4  — 事件处理函数中的 this
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.5K0
Python中的构造函数
Python中的构造函数是__init__函数。在Python中,子类如果定义了构造函数,而没有调用父类的,那么Python不会自动调用,也就是说父类的构造函数不会执行。
用户7886150
2020/12/20
1.7K0
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.5K0
Dom 事件处理函数
别人整理的,我顺手就给捏来了哈哈。很详细的一些事件,浏览器支持情况,以及详细的说明。在这里向整理者致敬。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr
练小习
2017/12/29
8480
虚函数中构造函数的调用顺序
1 /*曾经有段时间一直被构造函数中的虚函数所困扰,现在通过自己重新学习了一遍,标注一下容易忘记的知识*/ 2 #include<iostream> 3 using namespace std; 4 class Base0 5 { 6 public: 7 Base0(int var):var0(var) 8 { 9 cout<<"Construct base0"<<endl; 10 } ; 11 int var0; 12 void fun()
Gxjun
2018/03/22
3.5K0
虚函数中构造函数的调用顺序
【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )
在 Kotlin 类中 , 可以在 类声明 时 在 类名后 定义 " 主构造函数 " ;
韩曙亮
2023/03/30
4.9K0
继承中的构造方法内存处理
实际上在面向对象第一天的讲解当中,我们对内存方面做了一些隐瞒。因为除了Object类,所有的类都是有父类的。但是我们在考虑内存图时忽略了这点,现在,我们来简单描述加入了子父类关系后的对象内存图。
星哥玩云
2022/09/14
4810
继承中的构造方法内存处理
【学习笔记】SWIFT中的构造函数
2017-05-05 by Liuqingwen | Tags: Swift | Hits
IT自学不成才
2019/01/08
1.2K0
React的事件处理函数用法详解!
页面交互必然会伴随事件的发生,譬如HTML中的一个button被点击了一下,接下来页面应该怎么反应?就是需要button的onClick事件函数来处理。
Learn-anything.cn
2021/11/28
9000
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.2K0
C++构造函数 | 构造函数
react中的事件处理(二)
在React中,事件处理函数通常会与组件的状态(state)进行交互。我们可以通过更新状态来响应事件的发生。
堕落飞鸟
2023/05/19
8200
react中的事件处理(一)
React中的事件绑定采用了类似于HTML中的方式,但有一些语法上的差异。我们可以在组件中定义事件处理函数,并将其绑定到特定的事件上。
堕落飞鸟
2023/05/19
7080
解析C#类中的构造函数
彭泽0902
2018/01/04
3.4K0
关于C#事件处理函数中的参数(object sender, EventArgs e)
1、是事件源,表示触发事件的那个组件 如(button/label/listview...),比如说你单击button,那么sender就是button
zls365
2021/02/26
2.2K0
C++中类的构造函数和析构函数
构造函数 对象创建的时候执行 student s //空参构造函数 栈内存中 student s("测试")//带参构造函数 栈内存中 或者 student *s=new student//空参构造函
乱码三千
2021/07/29
2K0
C++中类的构造函数和析构函数
Java里的构造函数(构造方法)
本文转载之https://www.cnblogs.com/livterjava/p/4709561.html
用户7886150
2021/01/31
2.5K0
创造特殊的构造函数——寄生构造函数模式
当我们需要构造一个特殊的数据,我们可以通过寄生构造函数来实现。比如我们要格式化一个Array(简单举例),将其变成一个有“|”组成的字符串,我们可以这么做:
就只是小茗
2018/12/07
9530
点击加载更多

相似问题

函数可以处理'keypress‘事件,但不能处理我激发的相同的'keypress’事件

27

构造函数内部的事件处理

12

构造函数中的事件处理程序与事件处理程序在构造函数之外的行为不同。

11

未激发隐藏事件处理程序

10

UserControl的事件处理程序不会激发

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文