我需要以下列形式将参数传递给不安全的DllImported函数:
[DllImport("third_party.dll")]
private static extern unsafe int start(int argc, char** argv);
Run Code Online (Sandbox Code Playgroud)
我假设它是一个字符串数组.但是,当我尝试执行以下操作时,我得到'无法从字符串[]转换为char**'错误.我如何让这个工作?谢谢.
string[] argv = new string[] { };
start(0, argv);
Run Code Online (Sandbox Code Playgroud)
编辑1: 问题被标记为重复,但看着可能重复的问题,我仍然没有看到如何使这个工作.
编辑2:进一步确认问题和所需参数.它看起来像您的标准argc/argv参数(参数计数,然后是参数值).与启动ac程序的方式相同:int main(int argc, char** argv); 对于这个特殊问题,我根本不想传递任何参数(因此count为0).
编辑3: 我从第三方库供应商那里获得了更多信息.这里是:
编辑4:使用工作解决方案进行最终编辑(至少在我的情况下).我会把它作为答案,但不能,因为这个问题被标记为重复.这是一个帮助我最多的问题的链接.最后,dll函数需要一个指向带有ANSI字符串的缓冲区的指针数组. 所以我的最终方法(基于相关问题)如下.在内存中创建一个数组来保存指针,然后将每个字符串分配到内存中的其他位置,并在第一个指针数组中写入指向这些字符串的指针.此代码适用于生产:
[DllImport("third_party.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern int start(Int32 args, IntPtr argv);
public bool start(params string[] arguments)
{
int result;
if (arguments == null || arguments.Length == 0)
{
result = dll_system_startup(0, IntPtr.Zero);
}
else …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,用户可以在其中输入sql查询作为文本,我需要在我的应用程序中针对C#DataTable/Dataset运行它.有可能吗?
编辑:根据答案和一些更多的研究无法完成 - 没有办法将SQL查询应用于您已经读入应用程序的表.查看可能的解决方法的答案.
编辑2:我的最终解决方案是使用ANTLR实现一个简单的解析器.它允许用户使用"AND"和"OR"关键字以及括号输入简单查询.ANTLR生成的类会将其转换为一组指令,然后我可以使用它来查询C#数据集.
我正在使用C#中的WPF应用程序.我在静态类中定义了许多常量,如下所示:
PROJECT1:
namespace MyCompany
{
public static class Constants
{
public static int MY_CONSTANT = 123456;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要做的就是在Project 1中的任何地方访问我的常量:
int x = Constants.MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)
现在我将另一个项目添加到同一个解决方案中,并使用相同的根命名空间:
项目2
namespace MyCompany.MyControl
{
class VideoControl
{
int x;
x = Constants.MY_CONSTANT; //<-- doesn't work
x = MyCompany.Constants.MY_CONSTANT; //<-- doesn't work either
}
}
Run Code Online (Sandbox Code Playgroud)
我只是无法找到从第二个程序集访问我的静态Constants类的方法.我也无法添加对第一个程序集的引用,因为它导致循环依赖(第二个项目程序集是第一个项目程序集使用的WPF控件).
我正在努力做甚么可能吗?目前我的解决方法是在构造函数中传递所有必需的常量,但我宁愿直接访问它们.
我正在使用VS Community 2015,其中包含Setup Project扩展.我从未见过这个问题与2010一起工作.问题是当我将一个项目添加到输出时,Detected Dependencies列出了我在项目中使用的所有dll,包括内置的:
运行安装程序后,它继续安装一百个dll文件,包括应该是.NET Framework一部分的文件,如:
我确信:
我究竟做错了什么?如何让安装程序只安装不属于.NET Framework的dll(如Caliburn或NLog).谢谢.
编辑1:根据'Claudius'的问题,这里有一个据说安装在我的机器上的.NET框架列表.请注意,我正在尝试安装在我正在开发的同一台机器上.我的/ bin/Release文件夹没有任何.NET .System目录,应用程序从那里运行正常.

编辑2:发现另一个有类似问题的人.遗憾地未解决: Visual Studio安装项目:巨大的依赖项列表
这是我一直使用Threads/BackgroundWorker的东西,但我正在尝试迁移到Task的做事方式.
假设我有一个第三方SDK用于从USB端口读取字节.如果没有读取字节,则读取调用将阻塞并在100 ms后超时,返回null.如果读取字节,它会立即返回,返回读取字节的byte []数组.
所以我基本上需要一遍又一遍地轮询,并通过调用解析函数对接收到的字节采取措施.它是一个WPF应用程序,因此返回的字节应该能够传递给UI线程函数.
这样做的正确方法是什么?这是我到目前为止,它似乎工作,但我想确保它是使用TPL做事的正确方法:
private void _connectUsbButton_Click(object sender, RoutedEventArgs e)
{
ListenForUsbMessagesAsync();
}
private async void ListenForUsbMessagesAsync()
{
while (true)
{
byte[] readBytes = await ReadBytesAsync();
Parse(readBytes);
}
}
private Task<byte[]> ReadBytesAsync()
{
Task<byte[]> readBytesTask = Task.Run(() =>
{
byte[] bytes;
do
{
bytes = ReadBytes();
} while (bytes == null);
return bytes;
});
return readBytesTask;
}
private byte[] ReadBytes()
{
byte[] readBytes = _usbSdk.ReadBytes(); //100ms timeout (returns null if no bytes read)
return readBytes;
}
Run Code Online (Sandbox Code Playgroud) 假设我在MainWindow.xaml中有一个名为MyVideoControl的UserControl:
<Window Name="_mainWindow">
<Grid>
<MyVideoControl Name="_localVideo"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
现在,用户单击一个按钮,我希望UserControl在一个名为PopUp.xaml的新创建的窗口内浮动在MainWindow.xaml之上.
<Window Name="_popUpWindow">
<Grid>
<MyVideoControl Name="_localVideo"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
我如何实现这一目标,以便整个对象被移动?目前我使用XAML声明性地将MyVideoControl放在我的窗口中,但我猜我需要以编程方式完成所有操作?
我有以下绑定到 DataGrid 的 ObservableCollection:
public ObservableCollection<Message> Messages = new ObservableCollection<Message>;
Run Code Online (Sandbox Code Playgroud)
XAML:
<DataGrid ItemsSource="{Binding Path=Messages}">
Run Code Online (Sandbox Code Playgroud)
我在启动时对其进行排序,使用默认视图:
ICollectionView view = CollectionViewSource.GetDefaultView(Messages);
view.SortDescriptions.Add(new SortDescription("TimeSent", ListSortDirection.Descending));
Run Code Online (Sandbox Code Playgroud)
一切正常,但问题是每当我向 Messages 集合添加新消息时,它只会附加到列表的底部,而不是自动排序。
Messages.Add(message);
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我确信我可以通过每次添加项目时刷新视图来解决这个问题,但这似乎是错误的做法(更不用说性能方面了)。
我已经使用 VsVim 大约一年了。我总是能够使用默认的 ctrl+c 和 ctrl+v 快捷方式复制/粘贴文本。几天前它停止为我工作。我认为 VsVim 键盘设置必须以某种方式更改,以处理这些键而不是让 Visual Studio 来处理。当前按 Ctrl+v 可切换可视模式。问题是 vsvim 设置中没有 ctrl+v 或 ctrl+c 条目。任何解决方法?我讨厌必须右键单击鼠标才能进入复制/粘贴菜单,而且剪贴板缓冲区更加痛苦。
我正在尝试在WPF应用程序中打印之前显示"打印"对话框.我正在使用此链接中的 Microsoft示例代码
// Create the print dialog object and set options
PrintDialog pDialog = new PrintDialog();
pDialog.PageRangeSelection = PageRangeSelection.AllPages;
pDialog.UserPageRangeEnabled = true;
// Display the dialog. This returns true if the user presses the Print button.
Nullable<Boolean> print = pDialog.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
它在最后一行崩溃,但有以下异常:
PrintTicket提供程序无法绑定到打印机.Win32错误:打印机名称无效.
我试图寻找一个解决方案,人们建议的两个解决方案是安装打印机服务器功能,并切换到任何CPU版本,但这些都不适用于我的情况.
当前,每当我构建软件包时,都必须像这样在Product.wxs文件中手动增加Version属性:
<Product
Id = "*"
Version="4.1.3"
Run Code Online (Sandbox Code Playgroud)
我想自动化,以简化构建过程。我们对exe / dll文件使用以下版本控制方案:
major.minor.special.build
Run Code Online (Sandbox Code Playgroud)
特殊字符几乎从未使用过,并且设置为0,并且约定是按如下方式对打包的MSI进行版本控制,因为您只能使用三个数字:
major.minor.build
Run Code Online (Sandbox Code Playgroud)
我见过的唯一解决方案是让您获取另一个项目的4位数字版本,然后截断构建版本,因此最终得到以下结果:
major.minor.special
Run Code Online (Sandbox Code Playgroud)
显然,这对我们的方案不起作用,因为我们丢失了内部版本号。我该如何抓住major.minor.build而忽略特殊性?
假设我有两个任务,具有以下要求:
我提出了以下代码,但它只是在两个任务开始后挂起(WaitAny函数永远不会返回).我在Run函数下也得到了一条波浪线,告诉我在其中添加await,但当我尝试在Task.WaitAny前面添加它时,VS会抱怨.我应该在另一个任务中包装WaitAny吗?我究竟做错了什么?
async void Run()
{
Task task1 = Task1();
Task task2 = Task2();
int completedTaskIdx = Task.WaitAny(task1, task2);
Debug.WriteLine("completedTaskIdx = {0}", completedTaskIdx.ToString());
}
async Task Task1()
{
Debug.WriteLine("Task 1 Start");
await Task.Delay(5000);
Debug.WriteLine("Task 1 Stop");
}
async Task Task2()
{
Debug.WriteLine("Task 2 Start");
await Task.Delay(10000);
Debug.WriteLine("Task 2 Stop");
}
Run Code Online (Sandbox Code Playgroud)