有没有办法在本机(非托管)C++和(托管)C#之间共享枚举定义?
我在完全非托管代码中使用了以下枚举:
enum MyEnum { myVal1, myVal2 };
Run Code Online (Sandbox Code Playgroud)
我们的应用程序有时使用托管组件.该C#组件通过托管C++ interop dll(来自本机dll)获取枚举项值为int.(只有在需要C#组件时才会加载interop dll.)C#组件重复了枚举定义:
public enum MyEnum { myVal1, myVal2 };
Run Code Online (Sandbox Code Playgroud)
有没有办法消除重复,而无需将原生C++ DLL转换为托管dll?
我在你面前拿着一个DLL.仅使用Win32 SDK,您能告诉我这个DLL是否是.NET程序集吗?
为什么?我们的应用程序以DLL的形式加载插件.我们正在尝试扩展这些插件的定义以允许.NET程序集,但接口将是不同的,因此加载器将需要知道DLL在加载之前是管理还是非管理.
通过.NET 4.0中的转储调试支持,我们自动调查(当然询问用户:)创建C#程序崩溃的小型转储以将它们上传到我们的问题跟踪系统(以便minidumps可以帮助解决原因崩溃).
使用WithFullMemory minidump类型时,一切正常.我们可以看到堆栈和堆变量.不幸的是,即使对于小型C#程序,(zipped)转储也非常大.
如果我们使用"Normal"minidump类型,我们会得到一个非常小的转储,但托管调试器中甚至没有堆栈变量信息.事实上,任何比WithFullMemory更少的东西在托管调试器中似乎都没用.我们已经尝试过使用MINIDUMP_CALLBACK_ROUTINE将包含的模块信息限制到我们自己的模块,但它似乎对托管转储几乎没有影响,但仍设法破坏托管调试?
有没有人有关于如何修剪minidump同时保持其对托管调试有用的任何提示?
我需要将参数(POST)传递给@managedBean,我使用了这样的托管属性:
@ManagedProperty(value = "#{param.id}")
private int id;
Run Code Online (Sandbox Code Playgroud)
Bean的范围是ViewScope
我最终得到了这个错误:
无法创建托管bean收据.发现了以下问题: - 表达式#{param.id},request引用的对象的范围比引用的托管bean范围短
我能做什么?
arjan看看:
我的页面:Facelet Title
<form method="post" action="faces/index.xhtml">
<input name="id" value="4" />
<input type="submit" value="submit" />
</form>
<h:form>
<h:commandLink value="click" action="index">
<f:param id="id" name="id" value="20"/>
</h:commandLink>
</h:form>
Run Code Online (Sandbox Code Playgroud)
在常规的C#应用程序中,哪个类用于散列:xxxManaged或xxx(即SHA1Managedvs SHA1)以及为什么?
是否可以自动创建JSF托管bean?
例如,我有几个会话范围的bean.有时需要在代码中访问这些实例(而不仅仅是在JSF中),这可以通过以下方式完成:
PageBean pageBean = (PageBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("pages");
Run Code Online (Sandbox Code Playgroud)
但是,如果没有访问过调用'#{pages}'的页面,那么这会解析为null ...无论如何都要让JSF在范围'开始'时创建一个bean?那么在这种情况下理想情况下,当用户会话开始时,'pages'会立即在会话中实例化bean吗?
当我为实验目的编写以下代码段时,它引发了悬停错误(请参见屏幕截图):
无法声明指向非非托管类型的'动态'
片段:
dynamic* pointerToDynamic = &fields;
Run Code Online (Sandbox Code Playgroud)
虽然代码显然是不允许的(你不能使用托管类型的地址),但它提出了一个问题:什么是非非托管类型,它与托管类型有什么不同?或者只是Visual Studio试图搞笑?

我有一个包含C#和托管C++项目的解决方案.它在解决方案平台x64和x86中编译.由于它是托管C++,我想创建一个'Any CPU'解决方案并摆脱旧的解决方案.
我将C++项目链接器设置更改为x64和x86的强制安全IL映像.
接下来,使用Configuration Manager,我创建了一个名为"Any CPU"的新解决方案平台.接下来我添加了一个名为"Any CPU"的项目平台.
我继续将所有C#项目设置为"任何CPU",但对于C++我不能这样做.项目平台'Any CPU'不在下拉列表中,也没有选项'New ...'.
VS是关于它的,所以我保持它就像它并开始构建.令我惊讶的是,结果DLL(来自C++项目)是MSIL,即使C++的平台是x64.编译x32时也是如此,生成的DLL在MSIL中.
是什么赋予了?为什么我不能将C++项目设置为"任何CPU"?
我收到了错误
启用非托管调试时不允许更改
实际上我收到以下消息,但谷歌没有返回很多结果
启用非托管调试时,不允许更改
这是什么意思?我如何解决它?请注意,这是一个ASP.NET项目.选中"编辑并继续"不会使此错误消失.
我需要从托管的64位进程调用本机32位代码的情况越来越频繁,因为64位计算机和应用程序变得普遍.我不想将我的applciation标记为32位,我无法获得正在调用的64位版本的代码.
我目前使用的解决方案是创建C++ COM填充程序,这些填充程序在进程外加载以从64位进程进行32位调用.
这个COM填充程序解决方案运行良好,跨进程调用由COM在幕后处理,这最大限度地减少了这种方法的开销.
但是,我想保留我们使用C#进行的所有新开发,并想知道是否有任何框架可以最大限度地减少执行此操作的开销.我看过IPCChannel,但我觉得这种方法并不像COM shim解决方案那样整洁.
谢谢,艾德