小编Mar*_*far的帖子

从字节数组中读取C#中的C/C++数据结构

从byte []数组填充C#结构的最佳方法是什么,其中数据来自C/C++结构?C结构看起来像这样(我的C很生锈):

typedef OldStuff {
    CHAR Name[8];
    UInt32 User;
    CHAR Location[8];
    UInt32 TimeStamp;
    UInt32 Sequence;
    CHAR Tracking[16];
    CHAR Filler[12];
}
Run Code Online (Sandbox Code Playgroud)

并填写这样的东西:

[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
    [FieldOffset(0)]
    public string Name;

    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(8)]
    public uint User;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
    [FieldOffset(12)]
    public string Location;

    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(20)]
    public uint TimeStamp;

    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(24)]
    public uint Sequence;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    [FieldOffset(28)]
    public string Tracking;
}
Run Code Online (Sandbox Code Playgroud)

什么是复制OldStuff到的最佳方式NewStuff,如果OldStuff作为byte []数组传递? …

.net c# marshalling data-structures

78
推荐指数
3
解决办法
5万
查看次数

如何在Visual Studio中使用PHP

首先让我说我从来没有使用PHP,但我想学习它,所以我的问题是你如何在Visual Studio Ultimate中使用PHP?它类似于你如何声明JQuery即

$(document).ready(function () 
{ 
    // Code goes here?  
});
Run Code Online (Sandbox Code Playgroud)

我在Google上进行过多次搜索,但我找不到我想要的答案.

或者我需要一个完整的不同软件才能使用它?

php visual-studio

53
推荐指数
5
解决办法
23万
查看次数

Java时区搞砸了

我正在运行Tomcat应用程序,我需要显示一些时间值.不幸的是,时间过了一个小时.我调查了一下,发现我的默认TimeZone被设置为:

sun.util.calendar.ZoneInfo[id="GMT-08:00",
                           offset=-28800000,
                           dstSavings=0,
                           useDaylight=false,
                           transitions=0,
                           lastRule=null]
Run Code Online (Sandbox Code Playgroud)

而不是太平洋时区.当我尝试打印默认时区的显示名称时会进一步显示,并显示 "GMT-08:00",这似乎表明它未正确设置为美国太平洋时区.我在Ubuntu Hardy Heron上运行,从Gutsy Gibbon升级.

是否有可以更新的配置文件告诉JRE使用Pacific以及所有相关的夏令时信息?我的机器上的时间显示正确,因此它似乎不是操作系统范围内的错误配置.


好的,这是一个更新.一位同事建议我在我的/ etc/profile中更新JAVA_OPTS以包含"-Duser.timezone = US/Pacific",这有效(我也看到了CATALINA_OPTS,我也更新了).实际上,我只是将更改导出到变量而不是使用新的/ etc/profile(稍后重新启动将获取更改,我将是金色的).

但是,我仍然认为有一个更好的解决方案......应该有一个Java配置,它说明它正在使用什么时区,或者它是如何抓住时区的.如果有人知道这样的设置,那将是非常棒的,但是现在这是一个不错的解决方法.


我使用1.5,这绝对是一个DST问题.如您所见,时区设置为不使用夏令时.我的信念是它通常设置为-8偏移而不是特定的太平洋时区.由于泛型-8偏移没有夏令时信息,它当然不使用它,但问题是,我在哪里告诉Java在启动时使用太平洋时区?我不是在寻找程序化解决方案,它应该是一个配置解决方案.

java linux timezone

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

YouTube API截断视频[PHP]

我使用YouTube API按块上传视频块(请参阅下面的代码).但是,上传有时会因较大的文件(+ 1GB)而失败,但并非总是如此.上传显示已完成,但只能播放几分钟,其余内容将被截断.我做了一些研究,但没有取得明显的成功.我的问题现在:

  • 是否有可能直接联系YouTube(查看实际情况的日志)?
  • 这是一些编码问题吗?
  • 可以通过API捕获/检测错误(此刻,不会抛出异常)
  • 如果您一次上传不同的视频(并行,即),会发生这种情况吗?
  • 还有其他人遇到过这个问题吗?

非常感谢任何正确方向的帮助/领导.我甚至会打出500分的赏金,因为这让我发疯了(刚刚完成......)

附录:脚本在命令行上通过Gearman Server运行,并带有set_time_limit(0);set.代码/功能只是一个提取(运行较小的文件,有时甚至高达10GB).

编辑:根据airgistal和GeorgeQ上面的评论,我已经改变了while循环直接读取块(feof()不再是)并将状态保存到数据库.

/*
    Uploads one file to youtube chunk by chunk
*/
function uploadFile($dbfile) {
    $client = $this->client;
    $youtube = new Google_Service_YouTube($client);
    $htmlBody = "";

    try {
        // Create a snippet with title, description, tags and category ID
        // Create an asset resource and set its snippet metadata and type.
        // This example sets the video's title, description, keyword tags, and
        // …
Run Code Online (Sandbox Code Playgroud)

php youtube youtube-api

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

我应该在私有/内部方法中抛出null参数吗?

我正在编写一个包含多个公共类和方法的库,以及库本身使用的几个私有或内部类和方法.

在公共方法中,我有一个空检查和抛出这样的:

public int DoSomething(int number)
{
    if (number == null)
    {
        throw new ArgumentNullException(nameof(number));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这让我思考,我应该在什么级别添加参数null检查方法?我是否也开始将它们添加到私有方法?我应该只为公共方法做吗?

c# language-agnostic exception-handling software-design

29
推荐指数
6
解决办法
2550
查看次数

可以"分拆"几个GUI线程?(不在Application.Run停止系统)

我的目标

我想有一个主处理线程(非GUI),并能够根据需要在自己的后台线程中分离GUI,并让我的主非GUI线程继续工作.换句话说,我希望我的主非GUI线程成为GUI线程的所有者,反之亦然.我不确定Windows Forms(?)是否可行

背景

我有一个基于组件的系统,其中控制器动态加载程序集并实例化并运行IComponent使用单个方法实现公共接口的类DoStuff().

通过xml配置文件和添加包含不同实现的新程序集来配置加载的组件IComponent.组件为主应用程序提供实用程序功能.虽然主程序正在做这件事,例如控制核电站,组件可能正在执行公用事业任务(在他们自己的线程中),例如清理数据库,发送电子邮件,在打印机上打印有趣的笑话,你有什么.我想要的是使这些组件中的一个能够显示GUI,例如具有所述电子邮件发送组件的状态信息.

整个系统的生命周期如下所示

  1. 申请开始.
  2. 检查要加载的组件的配置文件.加载它们.
  3. 对于每个组件,运行DoStuff()以初始化它并使其在自己的线程中实现自己的生命.
  4. 继续做主要应用 - 工作之王,永远.

如果组件启动了GUI,我还没有能够成功执行第3点DoStuff().它只是暂停,直到GUI关闭.直到GUI关闭,程序才会进入第4点.

如果允许这些组件启动它们自己的Windows窗体GUI,那就太好了.

问题

当组件尝试启动GUI时DoStuff()(确切的代码行是组件运行时Application.Run(theForm)),组件以及因此我们的系统在该Application.Run()行"挂起" 直到GUI关闭.好吧,正如预期的那样,刚启动的GUI工作正常.

组件示例.一个与GUI没有任何关系,而第二个则是一个可爱的窗户,里面有粉红色蓬松的兔子.

public class MyComponent1: IComponent
{
    public string DoStuff(...) { // write something to the database  }
}

public class MyComponent2: IComponent
{
    public void DoStuff()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form());

        // I want the thread to immediately return after the GUI 
        // is fired up, …
Run Code Online (Sandbox Code Playgroud)

.net c# winforms

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

CSV字符串处理

创建CSV字符串的典型方法(伪代码):

  1. 创建一个CSV容器对象(如C#中的StringBuilder).
  2. 循环遍历要添加的字符串,在每个字符串后面添加逗号.
  3. 循环之后,删除最后一个多余的逗号.

代码示例:

public string ReturnAsCSV(ContactList contactList)
{
    StringBuilder sb = new StringBuilder();
    foreach (Contact c in contactList)
    {
        sb.Append(c.Name + ",");
    }

    sb.Remove(sb.Length - 1, 1);
    //sb.Replace(",", "", sb.Length - 1, 1)

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我喜欢通过检查容器是否为空来添加逗号的想法,但这是否意味着更多的处理,因为它需要在每次出现时检查字符串的长度?

我觉得应该有一个更简单/更清洁/更有效的方法来删除最后一个逗号.有任何想法吗?

c# csv

20
推荐指数
4
解决办法
7324
查看次数

这是确定OS体系结构的好方法吗?

由于WMI类Win32_OperatingSystem仅在Windows Vista中包含OSArchitecture,因此我使用注册表快速编写了一种方法,以尝试确定当前系统是32位还是64位系统.

private Boolean is64BitOperatingSystem()
{
    RegistryKey localEnvironment = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
    String processorArchitecture = (String) localEnvironment.GetValue("PROCESSOR_ARCHITECTURE");

    if (processorArchitecture.Equals("x86")) {
        return false;
    }
    else {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,它对我们来说非常好,但我不确定我有多喜欢浏览注册表.这是一个非常标准的做法还是有更好的方法?

编辑:哇,在预览中,该代码看起来更漂亮.下次我会考虑连接到pastebin或其他东西.

c# windows registry

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

如何以编程方式更改映射驱动器的标签?

我正在编写一个使用WNetAddConnection2 API 映射网络驱动器的软件.万一它是相关的,这是一个WebDAV驱动器,而不是一个普通的SMB共享.

驱动器采用我想要更改的默认名称.

网上的一些答案建议使用System.IO.DriveType,例如:

DriveInfo[] allDrives = DriveInfo.GetDrives();

foreach (var drive in allDrives)
{
    if (drive.DriveType == DriveType.Network && drive.Name.StartsWith("Z:"))
    {
        drive.VolumeLabel = "DriveInfo";
    }
}
Run Code Online (Sandbox Code Playgroud)

这明确地不适用于网络驱动器,并且由MSDN支持,其中声明UnauthorizedAccessException将抛出异常.

其次,我尝试使用shell方法:

Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";
Run Code Online (Sandbox Code Playgroud)

代码执行时没有错误,但不重命名驱动器.这就是它变得奇怪的地方,我找到了这些东西写入的注册表路径:

HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ MountPoints2

上面的代码创建了一个看起来正确的密钥,并添加了一个_LabelFromReg带有"Shell" 的REG_SZ作为值.但是,这不会反映在资源管理器或其他任何地方.

然后我通过右键单击并选择"重命名"手动重命名映射驱动器.

这样做会创建一个新的,稍微不同的键,MountPoints2其中完美地工作.

所以,上面的shell代码并没有完全正确地解决路径 - 我还能尝试其他的东西吗?上面让我相信Windows必须在内部使用不同的API调用来重命名驱动器?


更新1

这肯定与这些是WebDAV驱动器有关.必须进行一些引擎盖下的处理.

我的软件地图https://myurl.com@ssl/stuff/destination/docs.使用该Net Use命令可以看到确切的路径.这是shell上面的代码添加到注册表并尝试命名的路径.

但是,在Windows资源管理器中将鼠标悬停在驱动器上会让我https://myurl.com@ssl/anotherfolder/stuff/destination和在Explorer中手动重命名的路径添加到注册表中.

到目前为止,我已经设法弄清楚如何从WMI(Win32_LogicalDisk - > ProviderName)调用返回第二个路径,但我真的想避免手动注册表项.

c# windows

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

通过C#检测耳机是否已插入

没有示例如何通过C#检测耳机是否插入.

我认为应该是一些事件......

使用WMI有意义吗?

 ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\cimv2",
                                                                  "SELECT * FROM Win32_SoundDevice");

foreach (ManagementObject queryObj in searcher.Get())
{
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("Win32_SoundDevice instance");
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("StatusInfo: {0}", queryObj["StatusInfo"]);
}
Run Code Online (Sandbox Code Playgroud)

有人会很高兴提供它吗?

谢谢!

.net c# headphones audio-device

12
推荐指数
2
解决办法
6538
查看次数