我正在阅读WiX工具集手册的这一部分,并想知道如何强制WiX引导程序下载MSI软件包?例如,在安装我的应用程序之前,引导程序必须下载并安装:
我想,我可以MsiPackage像这样描述相应的:
但该参考架构的MsiPackage元素告诉,那
"至少必须指定SourceFile或Name属性."
而且,当然,它不是谎言 - 没有SourceFile或Name捆绑项目编译错误.
添加RemotePayload到MsiPackage这样的:
<MsiPackage Name="redist\SharedManagementObjects.msi"
DisplayName="Microsoft SQL Server 2008 R2 Management Objects"
DisplayInternalUI="yes"
Vital="yes"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkID=188438&clcid=0x409">
<RemotePayload Size="10953728"
Version="10.50.1600.1"
ProductName="Microsoft SQL Server 2008 R2 Management Objects"
Description="Microsoft SQL Server 2008 R2 Management Objects"
Hash="6ce3a433309c63d98bcf0e2b9f1dfaed8cc18783"/>
</MsiPackage>
Run Code Online (Sandbox Code Playgroud)
导致构建错误:
无法阅读包''.无法打开此安装包.验证程序包是否存在以及是否可以访问它,或与应用程序供应商联系以验证它是否为有效的Windows Installer程序包.
我错过了什么吗?
我想知道,有没有任何标准的方法来解析这样的路径类似的字符串:
Server[@Name='MyServerName']/Database[@Name='MyDatabaseName']/Table[@Name='MyTableName' and @Schema='MySchemaName']
Run Code Online (Sandbox Code Playgroud)
结果必须是:
这里最明显的是做一个正则表达式(当然,String.Split),但可能有一个更好的,标准的方式?
有关信息:字符串来自SMO Urn.Value.
UPDATE.
找到答案,见下文.
我的应用程序使用实体框架 6.1.0 和DbContextAPI。
它是某种 CAD 系统,旨在编辑一些工程文档。为了检测文档中更改的事实,我正在使用DbContext.ChangeTracker.HasChanges.
当文档具有大量数据(大约 20-25 万个实体)时,DbContext.ChangeTracker.HasChanges运行速度非常慢。由于此代码用于启用/禁用“保存”命令,因此它从 UI 线程执行得相当频繁。这反过来又会影响应用程序的性能。
我重写了这个片段:
private Lazy<DbContext> context;
public bool HasChanges
{
get
{
if (!context.IsValueCreated)
{
return false;
}
return context.Value.ChangeTracker.HasChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
对于这个:
public bool HasChanges
{
get
{
if (!context.IsValueCreated)
{
return false;
}
var objectStateManager = ((IObjectContextAdapter)context.Value).ObjectContext.ObjectStateManager;
return
objectStateManager.GetObjectStateEntries(EntityState.Added).Any() ||
objectStateManager.GetObjectStateEntries(EntityState.Deleted).Any() ||
objectStateManager.GetObjectStateEntries(EntityState.Modified).Any();
}
}
Run Code Online (Sandbox Code Playgroud)
而且(这是一个奇迹!)一切都运行得非常快。
看起来DbChangeTracker.HasChanges实施并不是最佳的。我错过了什么吗?
代码示例:
interface IFoo { }
class FooImpl : IFoo { }
static void Bar<T>(IEnumerable<T> value)
where T : IFoo
{
}
static void Bar<T>(T source)
where T : IFoo
{
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释,为什么这个方法调用:
var value = new FooImpl[0];
Bar(value);
Run Code Online (Sandbox Code Playgroud)
目标Bar<T>(T source)(因此,不编译)?
在解决重载时,编译器是否会考虑类型参数约束?
UPD.
避免与数组混淆.任何实现都会发生这种情况IEnumerable<T>,例如:
var value = new List<FooImpl>();
Run Code Online (Sandbox Code Playgroud)
UPD 2.
@ ken2k提到了协方差.但是,让我们忘掉FooImpl.这个:
var value = new List<IFoo>();
Bar(value);
Run Code Online (Sandbox Code Playgroud)
产生相同的错误.
我敢肯定,之间的隐式转换List<IFoo>和IEnumerable<IFoo>存在,因为我可以很容易地写出这样的事情:
static void SomeMethod(IEnumerable<IFoo> sequence) {}
Run Code Online (Sandbox Code Playgroud)
并传入value其中: …
我遇到过问题,使用ScrollViewer.
这是示例视图模型:
public class A
{
public string Text { get; set; }
}
public class B
{
public int Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......和DataTemplateSelector:
public class ViewModelTemplateSelector : DataTemplateSelector
{
public DataTemplate ATemplate { get; set; }
public DataTemplate BTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is A)
return ATemplate;
if (item is B)
return BTemplate;
return base.SelectTemplate(item, container);
}
}
Run Code Online (Sandbox Code Playgroud)
XAML:
<Grid>
<Grid.Resources>
<local:ViewModelTemplateSelector …Run Code Online (Sandbox Code Playgroud) 我有一些类型层次结构:
public class Base {}
public class Derived_1 : Base {}
public class Derived_2 : Base {}
// more descendants...
public class Derived_N : Base {}
Run Code Online (Sandbox Code Playgroud)
此层次结构中的类型用作视图模型中的查找列表:
public class SomeViewModel
{
// available items
public IEnumerable<Derived_N> SomeItems { get; }
// currently selected item
public Derived_N SelectedItem { get; set; }
// there could be several property pairs as above
}
Run Code Online (Sandbox Code Playgroud)
为了从查找列表中选择值,我创建了用户控件(某种选择器)。由于从选择过程的角度来看,所有Base后代看起来都相似,因此用户控件操作Base类型属性:
public IEnumerable<Base> ItemsSource
{
get { return (IEnumerable<Base>)GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); } …Run Code Online (Sandbox Code Playgroud) 我有一些CLR类型"MyType".是否可以通过XAML将typeof(MyType)结果作为Binding.ConverterParameter传递?
{Binding Converter={StaticResource myConverter}, **ConverterParameter=???**}
Run Code Online (Sandbox Code Playgroud) 我有两个项目的解决方案:
我知道,可以在WiX源($(var.WindowsFormsApplication1.TargetFileName))中引用项目输出.
现在我已经为我的.NET应用程序添加了一个NuGet包引用.所以,我想把NuGet包内容带到我的设置中.
有没有办法这样做而不是手动添加文件?
在剖析应用程序的内存使用情况时,我已经遇到了以下图表:

如您所见,在“快照1”行之前,非托管内存大约占已使用内存的一半。然后,在“快照1”和2分55秒(请参阅下面的时间线)之后,我强制执行垃圾收集。
如我所料,第2代主要是收集的,但是未托管的内存没有释放,现在它可以容纳大约2个。总已用内存的2/3。
我不知道在这种情况下“非托管内存”是什么意思。这是带有某些WinForms / GDI +互操作的WPF应用程序。我敢肯定,所有应该处置的东西都已处置。此外,也没有明确的平台互操作代码。其余的托管内存都可以。
这是内存泄漏指示吗?
如果是这样,在这里检测内存泄漏的方法是什么?
这很重要,我使用的探查器是JetBrains dotMemory。
我的 SSDT 项目中有几个数据迁移脚本。
第一个将数据从一个表存储到另一个临时表:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = N'DocumentEvent'
AND column_name = N'Thumbprint'
)
BEGIN
IF NOT EXISTS
(
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'tmp_DocumentEventCertificates'
)
BEGIN
CREATE TABLE tmp_DocumentEventCertificates
(
[EventId] UNIQUEIDENTIFIER NOT NULL,
[Thumbprint] nvarchar(100)
)
END
INSERT INTO
tmp_DocumentEventCertificates
SELECT
[EventId],
[Thumbprint]
FROM
[DocumentEvent]
WHERE
[Thumbprint] IS NOT NULL
END
Run Code Online (Sandbox Code Playgroud)
第二个将数据从临时表传输到另一个表:
IF EXISTS
(
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'tmp_DocumentEventCertificates'
)
BEGIN
UPDATE
[DocumentAttachment]
SET
[DocumentAttachment].[Certificate_Thumbprint] = …Run Code Online (Sandbox Code Playgroud) c# ×6
wpf ×3
wix ×2
wix3.6 ×2
binding ×1
converter ×1
dacpac ×1
datatemplate ×1
generics ×1
memory-leaks ×1
nuget ×1
parameters ×1
profiling ×1
scrollviewer ×1
sql-server ×1