在常规的C#应用程序中,哪个类用于散列:xxxManaged或xxx(即SHA1Managedvs SHA1)以及为什么?
我使用Visual C++和Win32 API学习了Windows编程.如今,似乎大多数应用程序都是使用C#在.NET中开发的.据我所知,大多数情况下,本机代码和托管代码之间没有太大的性能差异.所以我想知道,如果我今天开始编写一个新的桌面应用程序,是否有任何理由(除了我对C++更熟悉的事实),我可能想用非托管C++编写它.NET?使用C++和本机代码还有一些优势吗?或者在Windows平台上用.NET或多或少取代了这种方法?
当然我知道编写低级设备驱动程序和类似程序的人不会在.NET中这样做.我要求参考典型的面向客户端的应用程序,这些应用程序不会直接进行硬件调用.
我只是想了解为什么在Windows中有些事情如此复杂......
当我为实验目的编写以下代码段时,它引发了悬停错误(请参见屏幕截图):
无法声明指向非非托管类型的'动态'
片段:
dynamic* pointerToDynamic = &fields;
Run Code Online (Sandbox Code Playgroud)
虽然代码显然是不允许的(你不能使用托管类型的地址),但它提出了一个问题:什么是非非托管类型,它与托管类型有什么不同?或者只是Visual Studio试图搞笑?

我是一个应用程序的子类.我的子类Window过程在DLL中.我在DLL中的子类代码看起来有点像这样(剥离,删除其他不相关的部分).
class FooBar
{
private delegate int WndProcDelegateType(IntPtr hWnd, int uMsg,
int wParam, int lParam);
private const int GWL_WNDPROC = (-4);
private static IntPtr oldWndProc = IntPtr.Zero;
private static WndProcDelegateType newWndProc = new
WndProcDelegateType(MyWndProc);
internal static bool bHooked = false;
[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,
WndProcDelegateType dwNewLong);
[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,
IntPtr dwNewLong);
[DllImport("user32")]
private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd,
int Msg, int wParam, int lParam);
private static int …Run Code Online (Sandbox Code Playgroud) 我必须在我的.NET应用程序中使用第三方非托管COM dll.我需要修改此程序集以生成自定义RCW.为了编辑Interop程序集,我需要特定程序集的类型库.可以任何人解释我如何从非托管COM DLL生成类型库?
regsvr32中没有选项来生成类型库.
谢谢你,最诚挚的问候,Robo.
我知道在Windows下设置线程名称的非直观过程(请参阅" 如何将名称设置为Win32线程? ").有没有办法获得线程的名称?我没有看到任何允许我这样做的Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847 ( v=vs.85 ) .aspx).
我CreateService用来安装Windows服务可执行文件但是我似乎无法找到如何设置服务的描述.
有谁知道如何做到这一点?
谢谢.
我知道在C++/CLI中,在定义托管类时不能使用非托管类型:
public struct Unmanaged
{
int x;
int y;
};
public ref class Managed
{
int one;
Unmanaged two; //error C4368
};
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.Unmanaged它只是一个本机类型的集合 - 它的大小是已知的,当然它(我的意思是定义它的内存块)将被Managed"托管堆"内部的" 内存块"移动,并且元数据中存储的任何偏移都将保持有效,不是吗?就像声明了整数或浮点数一样?
为什么我们不能混合类型?
我需要从AddressBook框架转换此函数的返回值:
ABRecordCopyValue(nil, kABPersonPhoneProperty)
Run Code Online (Sandbox Code Playgroud)
到ABMultiValueRef类型的值
此功能目前标记为:
func ABRecordCopyValue(record: ABRecordRef!, property: ABPropertyID) -> Unmanaged<AnyObject>!
Run Code Online (Sandbox Code Playgroud)
所以我可以将它转换为Unmanaged,如下所示:
ABRecordCopyValue(person, kABPersonPhoneProperty) as Unmanaged<ABMultiValueRef>
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能将它作为ABMultiValueRef,以便我可以将它传递给这个函数?
func ABMultiValueGetIndexForIdentifier(multiValue: ABMultiValueRef!, identifier: ABMultiValueIdentifier) -> CFIndex
Run Code Online (Sandbox Code Playgroud)
我这样做了:
let managedPhones = Unmanaged.fromOpaque(phones.toOpaque()).takeUnretainedValue() as ABMultiValueRef
Run Code Online (Sandbox Code Playgroud)
我一直收到这个编译错误:
Bitcast requires both operands to be pointer or neither
%89 = bitcast %objc_object* %88 to %PSs9AnyObject_, !dbg !325
LLVM ERROR: Broken function found, compilation aborted!
Command /Applications/Xcode6-Beta3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 1
Run Code Online (Sandbox Code Playgroud)