什么是Wix'KeyPath '属性?特别是,它如何适用于以下内容:
<Component Id="ProgramMenuDir" Guid="*">
<RemoveFolder Id="ProgramMenuDir" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\CompName\AppName"
Type="string" Value="" KeyPath="yes" />
</Component>
Run Code Online (Sandbox Code Playgroud) 我想知道,这样当我的程序相关的数据文件被双击,打开应用程序和文件名作为参数传递给应用与我的C++应用程序注册文件扩展名的最彻底的方法.
目前,我通过我的wix安装程序执行此操作,但有些情况下应用程序将不会安装在用户的计算机上,因此我还需要通过应用程序创建注册表项的选项.
此外,这是否也意味着如果删除了应用程序,注册表中未使用的条目将被放置?
我一直在阅读这篇文章,以了解gcroot模板.我明白了
gcroot为垃圾收集堆提供句柄
然后
句柄本身不是垃圾收集.
我不明白的是以下内容:
当CLR对象与垃圾收集堆一起移动时,句柄将返回该对象的新地址.在将变量分配给gcroot模板之前,不必固定该变量.
这是否意味着即使存在引用该对象的gcroot句柄,垃圾收集器也会删除CLR对象?
它指的是什么是"新地址"?那么"变量在分配给gcroot模板之前不必固定"是什么意思?
我使用SWIG来包装我的c ++类.一些方法有const std::string&
一个参数.SWIG创建一个名为SWIGTYPE_p_std__string
但是在调用c#中的方法时不能只传递普通字符串的类型.以下示例仅是SWIG包附带的修改示例:
public void setName(SWIGTYPE_p_std__string name)
{
examplePINVOKE.Shape_setName(swigCPtr, SWIGTYPE_p_std__string.getCPtr(name));
if (examplePINVOKE.SWIGPendingException.Pending) throw examplePINVOKE.SWIGPendingException.Retrieve();
}
Run Code Online (Sandbox Code Playgroud)
在我的界面文件中我只有:
/* File : example.i */
%module example
%{
#include "example.h"
%}
/* Let's just grab the original header file here */
%include "example.h"
Run Code Online (Sandbox Code Playgroud)
并且用C++包装的方法是:
void Shape::setName(const std::string& name)
{
mName = name;
}
Run Code Online (Sandbox Code Playgroud)
我必须在接口文件中放入某种类型的地图吗?如果是这样,我该怎么做?
我正在实现构建器设计模式,以构建要在WPF UI上显示的不同类型的图形对象.我使用Ninject作为我的IOC容器.但是,我试图找到一个优雅的可扩展解决方案.
我有一个ChartDirector
对象IChartBuilder
作为依赖.我也有TemperatureChartBuilder
和ThresholdChartBuilder
实现IChartBuilder
.我想无论是注入TemperatureChartBuilder
或ThresholdChartBuilder
以ChartDirector
取决于被解雇或根据客户端调用的事件.我在下面用代码说明了我的问题.
// ChartDirector also depends on this
kernel.Bind<IExample>().To<Example>();
// when called in Method X...
kernel.Bind<IChartBuilder>().To<TemperatureChartBuilder>();
// when called in Method Y...
kernel.Bind<IChartBuilder>().To<ThresholdChartBuilder();
// TemperatureChartBuilder is a dependency of ChartDirector, need a way to dynamically
// allocate which binding to use.
var director = kernel.Get<ChartDirector>();
// without Ninject I would do
var director = new ChartDirector(new TemperatureChartBuilder);
// or
var director = new …
Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个实用程序类,它将在其中重载运算符.使它们成为成员或非成员(friend
)函数的利弊是什么?或者它是否重要?也许这是一个最好的做法?
将std :: vector转换为.NET List的最有效方法是什么?
为了给出一些上下文,我用C++/CLI包装一个非托管的C++类.C++/CLI类包含一个指向C++类的指针,我有一个每个公共方法的包装器.
一个方法返回一个std :: vector,所以在我的包装器中我将返回.NET类List.即
// unmanaged class
class A
{
public:
std::vector<int> runList();
}
// managed class
public ref class A
{
public:
// the below is obviously extremely inefficient
List<UInt32> MethodA()
{
std::vector<unsigned int> runList = mpChannelNode->runList();
std::vector<unsigned int>::iterator itr;
List<UInt32> list = gcnew List<UInt32>();
for (itr = runList.begin(); itr != runList.end(); itr++)
{
list.Add(*itr);
}
return list;
}
private:
A* mpChannelNode;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能提高效率呢?随意为.NET类推荐不同的返回类型.让我们假设我只需要以任何形式或形式有效地将该向量导入托管世界.
是否有一个花哨的LINQ表达式,可以让我以更简单的方式执行以下操作.我有一个List<List<double>>
,假设List是2d矩阵中的列,我想将列列表交换为行列表.我有以下明显的解决方案:
int columns = 5;
var values; // assume initialised as List<List<double>>()
var listOfRows = new List<List<double>>();
for (int i = 0; i < columns ; i++)
{
List<double> newRow = new List<double>();
foreach (List<double> value in values)
{
newRow.Add(value[i]);
}
listOfRows.Add(newRow);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将程序快捷方式添加到开始菜单快捷方式中的现有文件夹中.例如All Programs -> AppNameFolder -> AppNameVersionFolder -> AppShortcut
为了实现这一点,我添加了额外的行:
<Directory Id="ProgramMenuFolderApp" Name="App">
<Directory Id="ProgramMenuDir" Name="APP 6.3.0">
Run Code Online (Sandbox Code Playgroud)
到我的.wxs文件中的以下代码:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="Program Files">
<Directory Id="CompanyName" Name="CompanyName">
<Directory Id="App" Name="App">
<Directory Id="INSTALLDIR" Name="App 6.3.0">
<Component Id="MainExecutable" Guid="23FFE6FD-2BEA-4946-9875-8DBEEA5AAF55">
<File Id="AppEXE" Name="App.exe" Source="App.exe" KeyPath="yes">
<Shortcut Id="startmenu" Directory="ProgramMenuDir" Name="App 6.3.0" WorkingDirectory='INSTALLDIR' Icon="App.exe" IconIndex="0" Advertise="yes" />
<Shortcut Id="desktopApp" Directory="DesktopFolder" Name="App 6.3.0" WorkingDirectory='INSTALLDIR' Icon="App.exe" IconIndex="0" Advertise="yes" />
</File>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder" Name="Programs">
<Directory Id="ProgramMenuFolderApp" Name="App">
<Directory Id="ProgramMenuDir" Name="App6.3.0">
<Component Id="ProgramMenuDir" …
Run Code Online (Sandbox Code Playgroud)