我经常在使用Reflector时遇到很多不安全的代码.任何人都知道.NET有多少是非托管/安全的?
我在ac#dll中有一个托管对象,它维护一个c ++ dll中非托管对象的匿名整数句柄.在c ++ dll中,匿名整数在std :: map中用于检索非托管c ++对象.通过这种机制,我可以使用匿名整数句柄维护托管和非托管对象之间的松散关联.
在托管对象的finalize方法(析构函数)中,我调用了非托管dll来删除非托管对象.
一切顺利,因为c#程序运行,但程序退出时我遇到了问题.因为我无法控制托管端的删除操作顺序,所以在任何托管对象之前从内存中删除非托管dll.因此,当调用托管对象的析构函数(后者又调用非托管析构函数[至少间接调用])时,非托管对象已被删除,程序崩溃.
那么如何安全地删除与ac#program中的托管对象关联的外部c ++ dll中的非托管对象.
谢谢
安德鲁
我是JSF的新手,在表单中显示条件部分时遇到一些奇怪的问题.
我的面孔:
<h:form id="animalForm">
<h:selectOneRadio id="animal" onchange="submit()" value="#{index.animal}">
<f:selectItem itemLabel="Cat" itemValue="1"/>
<f:selectItem itemLabel="Dog" itemValue="2"/>
</h:selectOneRadio>
</h:form>
<h:outputText value="#{index.animal}"/>
<c:if test="#{index.animal eq 1}">
<h:outputText value="Cat"/>
</c:if>
<c:if test="#{index.animal eq 2}">
<h:outputText value="Dog"/>
</c:if>
Run Code Online (Sandbox Code Playgroud)
还有我的豆子:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "index")
@RequestScoped
public class IndexBean {
public static final int CAT = 1;
public static final int DOG = 2;
private int animal;
public IndexBean() {
}
public int getAnimal() {
return animal;
}
public void setAnimal(int animal) {
this.animal = …Run Code Online (Sandbox Code Playgroud) 我正在使用C++/CLI Wrapper从C#框架( - >托管)访问纯C++库( - >非托管).我想构建一种机制,使C++库能够将有关其状态的信息推送到框架.根据我的理解,这意味着我必须在某些时候至少从非托管代码调用托管函数.这是可能的,我怎样才能做到这一点?
非常感谢您的帮助!
最好的问候,雅各布
我与原生dll交互的.NET进程抛出OutOfMemory异常.以下是!address -summary和--eeheap-gc coammands.这是否意味着它是管理泄漏还是原生泄漏?
0:000>!address -summary
ProcessParametrs 002f10a8,范围002f0000 003f0000
环境002f07f0,范围002f0000 003f0000
--------------------使用摘要--------------------------
TotSize( KB)Pct(Tots)Pct(Busy)用法
17773000(384460):18.33%22.25%:RegionUsageIsVAD
168aa000(369320):17.61%00.00%:RegionUsageFree
110fe000(279544):13.33%16.18%:RegionUsageImage
395fe000(940024):44.83 %54.41%:RegionUsageStack 396000
(3672):00.18%00.21%:RegionUsageTeb
7540000(120064):05.73%06.95%:RegionUsageHeap
0(0):00.00%00.00%:RegionUsagePageHeap
1000(4):00.00%00.00%:RegionUsagePeb
0 (0):00.00%00.00%:RegionUsageProcessParametrs
0(0):00.00%00.00%:RegionUsageEnvironmentBlock
Tot:7fff0000(2097088 KB)忙:69746000(1727768 KB)
--------------------类型摘要--------------------------
TotSize( KB)Pct(Tots)用法
168aa000(369320):17.61%:
15970000(353728):16.87%:MEM_IMAGE
47e9000(73636):03.51%:MEM_MAPPED
4f5ed000(1300404):62.01%:MEM_PRIVATE
--------------------状态摘要--------------------------
TotSize( KB)Pct(Tots)用法
303e1000(790404):37.69%:MEM_COMMIT
168aa000(369320):17.61%:MEM_FREE
39365000(937364):44.70%:MEM_RESERVE
最大的自由区域:基数0d8b1000 - 大小0010f000(1084 KB)
0:000>!EEHeap -gc
GC堆数:1
代0开始于0x425f776c
第1代开始于0x425f5a08
第2代开始于0x01881000
临时段分配上下文:无
段开始分配大小
01880000 01881000 0281ecf8 0x00f9dcf8(16375032)
12010000 12011000 12f83a04 0x00f72a04 (16198148)
1e0a0000 1e0a1000 1e734094 0x00693094(6893716)
41e80000 41e81000 427048d0 0x008838d0(8927440)
大对象堆从0x02881000
段开始分配大小
02880000 02881000 02a36958 0x001b5958(1792344)
13010000 13011000 137c0020 …
我坚信,在.Net中的"纯"托管代码中不可能产生/生成访问冲突异常.如果一个人认为.Net是完美的,并且不使用任何外部库(不管理),例如interop.
我生活在幻想中吗?
是否可以通过使用Exchange Web服务(EWS)托管Api提供文件夹的路径来搜索公用文件夹中的所有文件夹和文件夹?
我已经安装了Nuget软件包"Unmanaged Exports(dllExport for .NET).使用MS Visual Studio 2010可以正常工作.
使用MSBuild(Windows SDK v7.1)我收到一个错误 Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
知道如何解决这个问题吗?
部分MSBuild输出:
MethodDeclarationParserAction: Found method: HSAdapter.HSAdapter..method public hidebysig static void 'CreateHSAdapterInstance'([out] class 'HSAdapter'.'IHSAdapter'& marshal( interface ) 'instance') cil managed
MethodPropertiesParserAction: Removing RGiesecke.DllExport.DllExportAttribute from HSAdapter.HSAdapter.CreateHSAdapterInstance
DeleteExportAttributeParserAction: Adding .vtentry:0 .export:CreateHSAdapterInstance
Parse IL: Deleting unused reference to RGiesecke.DllExport.Metadata.
Parse IL: Parsing 1676 lines of IL took 51 ms.
D:\HS4\packages\UnmanagedExports.1.2.4.23262\tools\RGiesecke.DllExport.targets(42,5): error : Index (zero …Run Code Online (Sandbox Code Playgroud) 我正在将托管 C++ 项目转换为 C# 项目。C++ 项目包括一个常量 C++ 头文件,它是项目外部存在的外部依赖项。
在新创建的 C# 文件中,有没有办法包含这个 C++ 头文件?我不想在 C# 文件中重新定义这些常量,因为客户端的更改将发生在 C++ 头文件上。
我无法理解托管C++如何工作和编译.
在.NET Framework中,您可以使用C#/ VB/F#/ ..等开发代码.并且所有这些语言都将编译为与Java字节码类似的相同公共中间语言(CIL).从理论上讲,CIL可以安装在任何平台上(Mono使其实用).在Windows上,CLR将CIL编译为本机代码Just-In-Time(JIT),一切运行顺利,好用.
现在,Managed C++如何编译?它是否编译为CIL代码并等待CLR使用JIT运行它?我认为不是,因为托管C++可以使用标准C++代码(不编译为CIL).此外,它如何使用.NET程序集(CIL)?
我将不胜感激任何帮助.谢谢
编辑:
我看到了这个答案.它指出,在C++/CLI中,托管代码被编译为MSIL,您可以选择将非托管代码编译为本机代码或MSIL.因此,我现在明白如何调用.NET程序集.
无论如何,如果将非托管代码编译为本机代码,我仍然不明白如何在同一程序集中使用托管代码运行C++非托管代码.有任何想法吗?