在.NET中,"Platform Target:Any CPU"编译器选项允许.NET程序集在x64计算机上以64位运行,在x86计算机上以32位运行.也可以使用"Platform Target:x86"编译器选项强制程序集在x64计算机上以x86身份运行.
是否可以使用"Any CPU"标志运行程序集,但是确定它是否应该在x86或x64 CLR中运行?通常,这个决定是由CLR/OS Loader(根据我的理解)基于底层系统的位数做出的.
我正在尝试编写一个可以与其他正在运行的进程交互(读取:注入代码)的C#.NET应用程序.x64进程只能注入其他x64进程,与x86相同.理想情况下,我想利用JIT编译和Any CPU选项,允许使用单个应用程序注入x64或x86进程(在x64机器上).
这个想法是应用程序将编译为任何CPU.在x64机器上,它将以x64运行.如果目标进程是x86,它应该重新启动它,强制CLR将其作为x86运行.这可能吗?
我遇到的情况CloseHandle是,SEHException在调试器下运行时,PInvoke调用将在.NET 4应用程序中抛出.与其他遇到类似问题从3.5迁移到4的问题不同,我并没有特别担心这种行为,并且已经找到了问题(第三方库CloseHandle在同一个句柄上调用了两次).但是,我很困惑为什么在.NET 3.5应用程序中不会发生这种行为.
以下小但完整的示例演示了我遇到的行为(在XP SP3和Win 7 x64上测试,总是编译为x86):
class Program
{
static void Main(string[] args)
{
try
{
var hFileMapping = CreateFileMapping(new IntPtr(-1), IntPtr.Zero, 0x04 /* read write */, 0, 0x1000, null);
CloseHandle(hFileMapping);
CloseHandle(hFileMapping);
Console.WriteLine("No exception");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFileMapping(IntPtr hFile, IntPtr lpAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
[DllImport("kernel32", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle); …Run Code Online (Sandbox Code Playgroud) 我一直在使用一些DirectShow接口来使用C#和DirectShow.Net播放数字电视(DVB-T).我最近遇到了运行时错误COM object that has been separated from its underlying RCW cannot be used.
此错误发生在以下行:
_guideData = _transportInformationFilter as IGuideData;
_transportInformationFilter 是IBaseFilter类型,是以前通过DirectShow.Net实用程序函数分配的COM对象.
我认为错误是由于_transportInformationFilter某种程度上过早释放,我跟踪它到以下方法(删除错误处理):
private void AttachGuideDataEvent()
{
IConnectionPoint connPoint = null;
IConnectionPointContainer connPointContainer = null;
try
{
connPointContainer = _transportInformationFilter as IConnectionPointContainer;
if (connPointContainer == null) /* error */
var guideDataEventGuid = typeof (IGuideDataEvent).GUID;
connPointContainer.FindConnectionPoint(ref guideDataEventGuid, out connPoint);
if (connPoint == null) /* error */
int cookie;
connPoint.Advise(this, out cookie);
if (cookie == 0) /* error …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用WPF WebBrowser控件(System.Windows.Controls.WebBrowser)的项目.程序的Web浏览器元素是用户可以参与的许多活动之一,并且在单独的窗口中打开.在用户离开浏览器之后,窗口关闭,每次用户返回浏览器时都会创建一个新窗口.我们注意到在我们的程序中出现了严重的内存泄漏/性能下降(在初次使用浏览器时,使用率从最初的200起大约达到700mb).在我们自己的代码中未能找到任何资源泄漏点后,我决定确定问题是否与我们自己的WebBrowser包装器控件或WPF控件有关.
我创建了一个新的简单项目,只包含一个MainWindow和一个WebWindow.主窗口上的一个按钮启动了一个针对gmail的浏览器(我们注意到的网站是我们检查过的少数几个问题).关闭此窗口后,不会释放资源(任务管理器或Process Explorer中的VM大小没有减少),并且进程处理的GDI对象数量不会减少(程序以~30开始,打开浏览器需要它到~140,关闭浏览器后~140仍然打开).打开另一个浏览器会导致更多句柄,并分配更多资源.此外,通过在WebBrowser控件上专门调用Dispose()无法解决此问题.代码很简单,如下:
主窗口:
<Window x:Class="WebBrowserMemory.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Button Click="Button_Click">Gmail</Button>
</StackPanel>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
Button_Click:
private void Button_Click(object sender, RoutedEventArgs e)
{
var win = new WebWindow();
win.Show();
win.Browser.Navigate("http://www.gmail.com");
}
Run Code Online (Sandbox Code Playgroud)
网页窗口:
<Window x:Class="WebBrowserMemory.WebWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WebWindow" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<WebBrowser Grid.Row="0" x:Name="_browser" />
<Button Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10" Padding="10" Click="Button_Click">Close</Button>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
相关守则:
public WebBrowser Browser {
get { return _browser; }
}
private void …Run Code Online (Sandbox Code Playgroud) 我使用FluidKit的 ElementFlow控件在WPF应用程序中获得奇怪的别名行为.我们在工作中的应用程序中使用控件来呈现内容,并且当ElementFlow的元素倾斜时,边缘别名如下图所示:

为了避免混叠,我们决定摆脱倾斜角度,所以我创建了一个快速测试应用程序,我将倾斜角度,项目间隙和弹出距离限制在滑块上,这样我就能找到最好看的东西.
但是,在使用相同设置的测试应用程序中,边缘很好地消除锯齿:

我假设有一些设置在XAML层次结构的某个地方控制它,但我已经尝试设置SnapsToDevicePixels各种元素和样式,无论是在设计时还是运行时(使用绑定和像Snoop这样的工具)无济于事.
ElementFlow的XAML如下:
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<Fluid:ElementFlow
x:Name="ContentElementFlow"
SelectedIndex="{Binding SelectedIndex}"
Focusable="True"
TiltAngle="15.95"
ItemGap="0.722"
FrontItemGap="0.052"
PopoutDistance="1.631"
HasReflection="False"
Background="Transparent"
CurrentView="{StaticResource CoverFlowView}"
ElementWidth="175"
ElementHeight="250"
>
<Fluid:ElementFlow.Camera>
<PerspectiveCamera
FieldOfView="60"
Position="0,0,6"
LookDirection="0,0,-6"
UpDirection="0,1,0"
/>
</Fluid:ElementFlow.Camera>
</Fluid:ElementFlow>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
Run Code Online (Sandbox Code Playgroud)
我还在两台不同的机器上试过这两个应用程序(一台运行XP Pro,一台XP Embedded,都有不同级别的专用图形),两者都在一个应用程序中显示别名,另一个应用程序显示抗锯齿.
有没有人知道可以用来控制它的任何设置或XAML属性?
我有一个DataTemplate由是源自媒体元素控制的MediaElementBase从WPF媒体工具库.该MediaElementBase类提供了两个属性,LoadedBehavior并UnloadedBehavior允许用户指定当元素加载/卸载会发生什么.
我发现在a DataTemplate(如下)中使用它时,这些属性在卸载模板时会重置为默认值,但在Unloaded调用事件之前,意味着只UnloadedBehavior执行默认值:
<DataTemplate DataType="{x:Type Channels:AnalogChannel}">
<Controls:AnalogTvGraphFileElement
LoadedBehavior="Play"
UnloadedBehavior="Stop"
Channel="{Binding}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
当控件只是页面上的元素并Unloaded通过正常的导航事件发生时,不会发生这种情况.
调试DependencyPropertyChanged EventHandler显示内部方法System.Windows.StyleHelper.InvalidatePropertiesOnTemplateNode(在PresentationFramework.dll中)检查是否DependencyProperty可能继承,如果不是,则使其无效.果然,更改LoadedBehavior/ UnloadedBehavior添加的属性元数据会FrameworkPropertyMetadataOptions.Inherits在模板更改时阻止此属性重置.
有谁知道为什么会这样?我可以添加Inherits标志作为解决方法,因为此元素没有受此影响的子元素,但我想知道为什么/是否正确的做法.
如果您正在了解有关我正在做什么以及为什么要更改的更多信息,DataTemplates您可以查看此问题以获取说明.
Blend支持显示样式资源的图形表示,并允许您选择要查看或修改的活动属性/事件触发器.但是,由DataTriggers控制视觉元素是很常见的.是否有可能告诉设计师它应该将DataTrigger视为"活动",以便可以在设计器中查看其视觉变化?
例:
<Style x:Key="MyBorder" TargetType="Border">
<Setter Property="CornerRadius" Value="5" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsRandomPropertyActive}" Value="True">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFFF8935" Offset="0" />
<GradientStop Color="#FFFF610C" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
在设计器中,这只显示一个空框,因为默认样式不定义特定的视觉方面.反正有没有告诉设计师我希望它假设IsRandomPropertyActive是真的,并显示适当的样式?
有没有人成功将VS 2008 C++/CLI(vcproj)项目转换为VS 2010项目(vcxproj),同时将.NET 3.5作为目标框架?我无法做到这一点并让项目成功构建.该项目在VS2008中编译为.NET 3.5,在VS2010中编译为.NET 4.0,但我无法在2010年使用.NET 3.5.IDE似乎没有为它提供选项,并且修改了vcxproj文件通过增加
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
Run Code Online (Sandbox Code Playgroud)
导致编译失败,并出现以下错误:
Error 1 error C1001: An internal error has occurred in the compiler.
Run Code Online (Sandbox Code Playgroud)
根据这个链接,在VS2008和2010之间使用的编译器显然存在一些差异,但仍然建议手动编辑项目文件作为解决方案.有没有人对此有任何想法?
是否有任何情况下a的内容ContentPresenter将是某个对象而不是UIElement?鉴于该字段被声明为对象而不是a UIElement,似乎可能存在.但是,我想不出它会出现的任何情况,或者即使它是有效的.
ContentPresenter presenter = GetTemplateChild(PART_Presenter) as ContentPresenter;
UIElement myElement = (UIElement)presenter.Content;
myElement.SomeUIMethod(); // possible InvalidOperationException?
Run Code Online (Sandbox Code Playgroud) c# ×6
wpf ×5
.net ×4
interop ×2
64-bit ×1
antialiasing ×1
browser ×1
c++-cli ×1
c1001 ×1
clr ×1
com ×1
datatemplate ×1
datatrigger ×1
memory-leaks ×1
pinvoke ×1
uielement ×1
visual-c++ ×1
winapi ×1
xaml ×1