小编jef*_*ora的帖子

在'Any CPU'.NET程序集上强制使用x86 CLR

在.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运行.这可能吗?

c# clr 64-bit code-injection

56
推荐指数
4
解决办法
2万
查看次数

为什么在.NET 4和3.5之间处理来自CloseHandle的异常?

我遇到的情况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)

.net c# pinvoke winapi interop

18
推荐指数
1
解决办法
2970
查看次数

我何时需要在C#中通过COM查询的接口上调用Marshal.ReleaseComObject

我一直在使用一些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)

c# com interop

11
推荐指数
2
解决办法
1万
查看次数

在多个窗口中使用WPF WebBrowser控件时内存泄漏

我正在开发一个使用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)

c# browser wpf memory-leaks

10
推荐指数
1
解决办法
8989
查看次数

WPF 3.5中的抗锯齿不一致

我使用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属性?

.net wpf antialiasing

9
推荐指数
1
解决办法
1328
查看次数

WPF DataTemplate在卸载时重置某些依赖项属性

我有一个DataTemplate由是源自媒体元素控制的MediaElementBaseWPF媒体工具库.该MediaElementBase类提供了两个属性,LoadedBehaviorUnloadedBehavior允许用户指定当元素加载/卸载会发生什么.

我发现在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您可以查看此问题以获取说明.

.net c# wpf datatemplate

7
推荐指数
1
解决办法
1305
查看次数

是否可以在Expression Blend 3中查看设计中数据触发器的效果?

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是真的,并显示适当的样式?

wpf xaml datatrigger expression-blend

5
推荐指数
1
解决办法
978
查看次数

在Visual Studio 2010 Beta 2中定位.NET 3.5 C++/CLI

有没有人成功将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之间使用的编译器显然存在一些差异,但仍然建议手动编辑项目文件作为解决方案.有没有人对此有任何想法?

.net c++-cli visual-studio-2010 visual-c++ c1001

3
推荐指数
1
解决办法
3760
查看次数

将ContentPresenter.Content强制转换为UIElement是否合适?

是否有任何情况下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# wpf contentpresenter uielement

1
推荐指数
1
解决办法
870
查看次数