小编Fun*_*unk的帖子

将代码注入运行WPF应用程序的最佳方法

这是我的任务:

  • 将自定义托管代码注入正在运行的托管WPF应用程序(即我的代码应该在其他AppDomain中运行)
  • 注入的代码必须在UI线程上执行

当我说"最好"时,我的意思是:

  • 注射过程必须尽可能稳定(没有线程死锁等)
  • 代码应该在x86和x64平台上运行没有问题(特别是在Vista x64上)

最小的用例

  • 选择运行WPF程序
  • 注入自定义代码
  • 注入代码将目标进程主窗口的标题更改为"Code Injected"

我正在评估的解决方案:

1)通过窗口挂钩注入(如在Snoop中)

优点:

  • 注入的代码在UI线程上运行

缺点:

  • 需要混合(c ++/cli)外部dll
  • 很难调试

2)通过EasyHook库注入

优点:

  • 库看起来坚固且经过充分测试

缺点:

  • 没有找到在UI线程上运行代码的方法
  • 注入库必须在GAC中签名并安装

3)通过WriteProcessMemory/CreateRemoteThreadEx/LoadLibrary注入

优点:

  • 简单

缺点:

  • 非常不稳定(代码必须在DllMain中执行,需要CLR托管等)

我将使用方法#1.你能推荐一个更好的方法吗?

在非托管DLL中是否有基于CLR托管的体面技术?

请注意,我知道这些问题:

.net wpf code-injection

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

F#记录与班级

我曾经认为a Record是(不可变的)数据的容器,直到我遇到一些有启发性的阅读.

鉴于函数可以被视为F#中的值,记录字段也可以保存函数值.这提供了状态封装的可能性.

module RecordFun =

    type CounterRecord = {GetState : unit -> int ; Increment : unit -> unit}

    // Constructor
    let makeRecord() =
        let count = ref 0
        {GetState = (fun () -> !count) ; Increment = (fun () -> incr count)}

module ClassFun =

    // Equivalent
    type CounterClass() = 
        let count = ref 0
        member x.GetState() = !count
        member x.Increment() = incr count
Run Code Online (Sandbox Code Playgroud)

用法

counter.GetState()
counter.Increment()
counter.GetState()
Run Code Online (Sandbox Code Playgroud)

似乎除了继承之外,Class用a Record和helper函数做的事情并没有多少.其功能概念更好,例如模式匹配,类型推断,高阶函数,通用等式......

进一步分析,Record …

oop f# types

10
推荐指数
2
解决办法
1447
查看次数

ListBox组中的垂直分隔符

我有一个ListBox基于这样的属性进行分组的地方:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listbox.ItemsSource);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("CurrentDate");
view.GroupDescriptions.Add(groupDescription);
Run Code Online (Sandbox Code Playgroud)

分组后我想在组之间添加一个垂直分隔符,我写了一个这样的代码:

<ListBox.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
                    <TextBlock Text="{Binding Path=Name}"
                               FontWeight="Bold"/>
                </StackPanel>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
    </GroupStyle>
</ListBox.GroupStyle>
Run Code Online (Sandbox Code Playgroud)

但它看起来像这样:

在此输入图像描述

虽然我想要一个分隔符完全下降,但当我试图增加分隔符的高度时,项目随之下降.

c# wpf listbox

8
推荐指数
2
解决办法
566
查看次数

F#中的接口对象语法

我正在将多页打印的C#代码翻译成F#.有人可以告诉我如何翻译:

((IAddChild)page1Content).AddChild(page1)
Run Code Online (Sandbox Code Playgroud)

背景:

       // printdia = printdialog
       // printdoc = printdocument

       // create a page
       let page1 = new System.Windows.Documents.FixedPage()
       page1.Width <- printdoc.DocumentPaginator.PageSize.Width
       page1.Height <- printdoc.DocumentPaginator.PageSize.Height
       page1.Children.Add(printcanvas) |> ignore
       // add the page to the document
       let page1Content = new System.Windows.Documents.PageContent()
 (*C#*)((IAddChild)page1Content).AddChild(page1)
       printdoc.Pages.Add(page1Content) |> ignore
       // and print
       printdia.PrintDocument(printdoc.DocumentPaginator, ordernr.Text);
Run Code Online (Sandbox Code Playgroud)

C#中的原始代码

c# syntax f#

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

在连接的节点之间画线

概述:我有一个XAML Canvas控件,我在其上放置了几个Line控件.线条出现在它们不应该的位置,我的结论是所述线条的边界框是行为不端的.我不访问或更改这些边界框(据我所知).

项目详细信息:我在Visual Studio 2010中使用WPF,XAML,C#和MVVM模式.

更详细的解释:我的项目是创建一个画布,并在该画布上有可以被用户拖动的项目.在一个项目和另一个项目之间绘制线条以显示可视链接.

要进行可视化,您可以在此处查看图像:

在此输入图像描述

有五个项目,在代码中,N1项目应按行链接到N3,N4和N5项目.N1到N3线看起来很好,但另外两条线是偏移的.如果你要将它们移动起来,它们会很好地将这些项目链接在一起.

你可以考虑的第一件事是画布中线条的坐标,我已经这样做了.

请查看此图片:

在此输入图像描述

我在与Line相同的区域内向XAML添加了一个TextBlock,并将其Text绑定到Line的StartingPoint.如果图像很小,可能很难看到这里,但我可以告诉你,这里的两条线的StartingPont是相同的.然而,显然我们可以看到线条不在同一个地方.

我还认为这可能是一个对齐的问题.我没有在我的项目中设置任何路线,所以我想也许这就是问题所在.我将线条改为不同的对齐方式(水平和垂直方向)以及项目本身,我发现没有区别.

项目更详细:

首先是项目本身的资源.我不认为它有所作为,但由于我全都没有想法,我不能忽视这个问题可能在某个地方看不见:

<ResourceDictionary>
        <ControlTemplate x:Key="NodeTemplate">
            <Border BorderThickness="2" BorderBrush="LightBlue" Margin="2" CornerRadius="5,5,5,5">
            <StackPanel>
                <TextBlock Text="Test" Background="AntiqueWhite"/>
                <TextBlock Text="{Binding Path=NodeText}" Background="Aqua"/>
                </StackPanel>
                </Border>
        </ControlTemplate>
    </ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

现在,在下面,Canvas本身具有ItemsControls:

<Canvas>


    <ItemsControl ItemsSource="{Binding NodeList, UpdateSourceTrigger=PropertyChanged}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl ItemsSource="{Binding LineList, UpdateSourceTrigger=PropertyChanged}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>

                            <StackPanel>
                                <Line Stroke="Black" X1="{Binding StartPoint.X}" Y1="{Binding StartPoint.Y}" X2="{Binding EndPoint.X}" Y2="{Binding EndPoint.Y}"  />
                            <!--Path Stroke="Black" Data="{Binding}" Canvas.Left="0" Canvas.Top="0" StrokeMiterLimit="1"/-->
                                <TextBlock Text="{Binding StartPoint}" HorizontalAlignment="Center"/>
                            </StackPanel>
                        </DataTemplate> …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml itemscontrol mvvm

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

标签 统计

c# ×3

wpf ×3

f# ×2

.net ×1

code-injection ×1

itemscontrol ×1

listbox ×1

mvvm ×1

oop ×1

syntax ×1

types ×1

xaml ×1