我即将开始阅读大量的二进制文件,每个文件有1000个或更多记录.不断添加新文件,因此我正在编写Windows服务来监视目录并处理收到的新文件.这些文件是用c ++程序创建的.我在c#中重新创建了结构定义并且可以很好地读取数据,但是我担心我这样做会最终导致我的应用程序死机.
using (BinaryReader br = new BinaryReader(File.Open("myfile.bin", FileMode.Open)))
{
long pos = 0L;
long length = br.BaseStream.Length;
CPP_STRUCT_DEF record;
byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))];
GCHandle pin;
while (pos < length)
{
buffer = br.ReadBytes(buffer.Length);
pin = GCHandle.Alloc(buffer, GCHandleType.Pinned);
record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF));
pin.Free();
pos += buffer.Length;
/* Do stuff with my record */
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我不需要使用GCHandle,因为我实际上并没有与C++应用程序通信,所有内容都是通过托管代码完成的,但我不知道另一种方法.
我在编组指向字符串数组的指针时遇到了一些麻烦.它看起来像这样无害:
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
Run Code Online (Sandbox Code Playgroud)
这实际上是嵌入在另一个结构中,如下所示:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
Run Code Online (Sandbox Code Playgroud)
非托管代码回调到托管代码,并将Outerstruct作为IntPtr返回,并分配内存并填入值.
[StructLayout(LayoutKind.Sequential)]
public struct UnmanagedStruct
{
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)]
public string[] listOfStrings;
}
[StructLayout(LayoutKind.Sequential)]
public struct Outerstruct
{
public UnmanagedStruct ums;
}
public void CallbackFromUnmanagedLayer(IntPtr outerStruct)
{
Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct));
// The above line FAILS! it throws an exception complaining it cannot marshal listOfStrings field in the inner struct and that its managed representation is incorrect!
}
Run Code Online (Sandbox Code Playgroud)
如果我将listOfStrings改为简单地为IntPtr,那么Marshal.PtrToStructure可以工作,但现在我无法翻录到listOfStrings并逐个提取字符串.
在被C#自动设置新类的默认命名空间以与我的文件夹结构相匹配多年后,我想知道是否有任何办法让VB.NET做同样的事情?
我已经知道有一段时间它没有自动执行此操作,但我从未真正研究过其他选择.是否有任何工具或技巧可以帮助我保持VB.NET类命名空间与我的项目文件夹结构同步?
是否有可以通过可视化工作室解决方案运行的工具,并将访问修饰符调整为未在解决方案中调用的任何内容转换为私有或内部(如果适用)?
我想我可以将所有内容更改为私有,然后使用编译器消息并手动执行...但这可能需要一段时间,如果有自动的东西,这将是太棒了!
我有一个在Visual Studio(2008)中构建的C++应用程序,并链接到Boost DLL.在调试时,似乎我需要将Boost DLL复制到调试文件夹中,以便我在IDE中运行的exe可以链接到它.我可以使用后期构建步骤来复制DLL,但我想知道Visual Studio中是否有一个设置可以在调试时为DLL提供额外的搜索路径?
我有例如5列出所有相同的类型.我能做到吗?
List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
Run Code Online (Sandbox Code Playgroud) 我使用.NET框架1.1,我希望有人可以帮我实现动态的对象数组?
我希望使用的对象的淡化示例如下.
Class CarObj
{
public string CarName;
public string CarYear;
}
Run Code Online (Sandbox Code Playgroud)
我应该使用ArrayList还是你认为制作一个CarList类来实现IList接口会更好?一个人对另一个人有性能上的好处吗?
我在Windows 7上使用c#构建了一个Windows应用程序.
一切都运行正常,所以我创建了一个安装向导项目,然后构建它.一旦我安装了应用程序,我就可以正确打开它,但是当我尝试执行一些写入文本文件的操作(带有日志记录)时,它会崩溃,并向我发出以下错误消息:
UnauthorizedAccessException
访问路径'C:\ Program Files(x86)\ MSProgram\MSProgram\log.txt'被拒绝.
当我手动给该文件夹完全权限时,它工作正常.现在,问题如下:
如何以编程方式为应用程序目录中的内容编写应用程序权限?因此,每个下载它的人都不会遇到同样的问题.
我在ac #project,在这个项目中我引用(使用项目引用)另一个用vb.net编写的类库.
现在,当我右键单击并查看该类的定义时.它没有带我到vb.net项目中的确切源代码,而是带我到动态生成的vb.net类的c#表示.
我已经尝试了反向实验,从vb.net项目开始,并引用了ac #project,这次是右键单击视图定义,它将我带到代码浏览器,所以再次,不是原始代码进行编辑.
如果两个项目都是相同的语言,一切都很好.
对此有解释吗?可能是一个允许在不同语言的项目之间轻松导航代码的解决方案?
重现:
在c#类中,添加对vb.net类的引用,例如:
VBClassLibrary.VBClass myVBClass = new VBClassLibrary.VBClass();
现在,右键单击VBCLass并选择"转到定义".
注意你最终的地方....
c# ×7
c#-3.0 ×2
marshalling ×2
pinvoke ×2
.net ×1
arraylist ×1
generics ×1
ilist ×1
linq ×1
performance ×1
refactoring ×1
unmanaged ×1
vb.net ×1