我使用一些旧的API,需要将结构的指针传递给异步运行的非托管代码.
换句话说,在我将struct指针传递给非托管代码之后,非托管代码会复制指针并立即返回.非托管代码可以在后台访问该结构,在另一个线程中.我无法控制在另一个线程和线程本身中运行的非托管代码.
fixed {}语句不能用于固定,因为它不是为异步非托管固定而设计的.
GCHandle只能引用引用,因此必须将结构框设置为使用GCHandle.我尝试过,它的确有效.它的主要问题是您无法从托管代码更新结构.要更新结构,首先我们需要将其取消装箱,然后更新,然后再次装箱,但是......哎呀......再次装箱?!?这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码...不适用于我的案件.
如何在没有固定{}语句的情况下在内存中固定结构,以便我可以在不更改指针的情况下从托管代码更新它?
谢谢.
编辑:
只是想...有没有办法固定包含结构的父对象,然后获取结构的指针而不是容器对象?
public void DoSomething(params object[] args)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
上述签名的问题是,将传递给该方法的每个值类型都将被隐式装箱,这对我来说是严重的性能问题.
有没有办法去掉一个方法,接受可变数量的参数而不装箱值类型?
谢谢.
我正在尝试在DWM Glass下处理TextBox文本的颜色.我读了很多材料,仍然没有完美的解决方案.
我在这里找到了几乎完美的结果代码:http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/,但它有很多轻弹和特定于事件的操作(例如:键入一些文本并按"主页"按钮).
我试图解决这些问题.
以下代码是原始代码的变体,但它不依赖于任何事件,只是WM_PAINT.它仍然轻弹,插入符号(文本光标)以某种方式消失了!
如何防止闪烁,以及如何获取插入符号(文本光标)?
谢谢.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;
namespace AeroWindowsFormsApplication
{
public class AeroTextBox : TextBox
{
private const int WM_PAINT = 0xf;
private bool _aeroFix;
public AeroTextBox()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}
protected override void WndProc(ref Message m)
{
if (_aeroFix)
{
switch (m.Msg)
{
case WM_PAINT:
RedrawAsBitmap();
m.Result = new IntPtr(1);
break;
default:
base.WndProc(ref m);
break;
}
}
else
{ …Run Code Online (Sandbox Code Playgroud) 我想合并以下代码中的catch块,以实现代码重用:
try
{
DoSomeInputOutput();
}
catch (InvalidOperationException ex)
{
HandleKnownException1(ex);
}
catch (InvalidDataException ex)
{
HandleKnownException1(ex);
}
catch (ArgumentNullException ex)
{
HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
{
HandleKnownException2(ex);
}
catch (ArithmeticException ex)
{
HandleKnownException2(ex);
}
catch (InvalidCastException ex)
{
HandleKnownException2(ex);
}
catch (Exception ex)
{
HandleUnknownException(ex);
}
Run Code Online (Sandbox Code Playgroud)
这样的事情:
try
{
DoSomeInputOutput();
}
catch (InvalidOperationException ex)
catch (InvalidDataException ex)
catch (ArgumentNullException ex)
{
HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
catch (ArithmeticException ex)
catch (InvalidCastException ex)
{
HandleKnownException2(ex);
}
catch (Exception ex)
{ …Run Code Online (Sandbox Code Playgroud) 我编写了一个WCF服务,它应该使用Streamed TransferMode NetTcpBinding和System.IO.Streamobject 来转换任意大小的文件.
在运行性能测试时,我发现了显着的性能问题.然后我决定使用Buffered TransferMode进行测试,看到性能提高了两倍!
因为我的服务应该传输大文件,所以我不能留在Buffered TransferMode,因为服务器和客户端的大文件的内存管理开销在一起.
为什么Streamed TransferMode比Buffered TransferMode慢?我该怎么做才能让Stremed表现更好?
我需要一个方法,它接受一个Type并返回该类型中使用的所有程序集的路径.我写了这个:
public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type)
{
yield return type.Assembly.Location;
foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())
{
yield return Assembly.Load(assemblyName).Location;
}
}
Run Code Online (Sandbox Code Playgroud)
通常这种方法可以完成这项工作,但也有一些缺点:
我没有找到如何从类型本身获取引用的程序集/类型,所以我使用了type.Assembly.GetReferencedAssemblies()并获得了整个程序集的引用,而不仅仅是那些与类型相关的引用.
type.Assembly.GetReferencedAssemblies()返回AssemblyName,没有location/path/filepath属性.要获取location属性,我首先使用Assembly.Load()然后使用location属性.我不希望加载程序集获取它们的路径,因为它们没有必要使用,并且因为Assembly.Load()可能因FileNotFoundException或BadImageFormatException而失败.
假设我有一个char*类型的指针到unicode字符串,我知道长度:
char* _unmanagedStr;
int _unmanagedStrLength;
Run Code Online (Sandbox Code Playgroud)
我有2种方法将其转换为.NET字符串:
Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);
Run Code Online (Sandbox Code Playgroud)
和
new string(_unmanagedStr, 0, _unmanagedStrLength);
Run Code Online (Sandbox Code Playgroud)
在我的测试中,两个调用都给出了完全相同的结果,但它new string()比1.8倍快Marshal.PtrToStringUni().
为什么这种性能差异?两者之间还有其他功能差异吗?
处理Control.OnKeyPress事件时,有一个KeyPressEventArgs包含a KeyChar.
出于可用性原因,我需要完全相同KeyChar但处理OnKeyDown事件时.
在KeyEventArgs不包含任何字符有关的数据.我的意思是,如果A按键有或没有Shift影响KeyCode,KeyData或者KeyValue.使用另一种语言时,我仍然可以获得资本英语价值.
如何获得KeyPressEventArgs.KeyChar内部KeyDown活动?
谢谢.
我的程序作为一个提升的进程运行,并启动新的进程Process.Start().
出于安全原因,我希望将这些新进程作为非提升程序运行.
怎么做?
我正在使用Visual Studio 2010 SP1,目标框架是2.0,平台目标:任何CPU,在Windows 7 x64 SP1下进行测试.
我遇到了奇怪的表现行为.
如果没有app.config,或者使用以下app.config,它会让我的程序运行缓慢(秒表显示~0.11秒)
<?xml version="1.0"?>
<configuration>
<startup >
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
以下app.config使我的程序运行速度提高了x5倍(秒表显示~0.02秒)
<?xml version="1.0"?>
<configuration>
<startup >
<supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0" />
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这是测试程序代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
while (true)
{
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++ )
{
"blablabla".IndexOf("ngrhotbegmhroes", StringComparison.OrdinalIgnoreCase);
}
Console.WriteLine(sw.Elapsed);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我坐了几个小时,无法弄清楚这里发生了什么.你知道吗?
.net ×10
c# ×10
performance ×3
unmanaged ×2
assemblies ×1
boxing ×1
char ×1
code-reuse ×1
controls ×1
dwm ×1
keydown ×1
marshalling ×1
pinning ×1
reference ×1
reflection ×1
streaming ×1
string ×1
struct ×1
textbox ×1
try-catch ×1
uac ×1
unsafe ×1
value-type ×1
wcf ×1