我需要为我的WCF客户端端点添加自定义行为扩展.我尝试通过配置执行此操作,但是被WFC配置无法正确解析类型名称时经常提到的错误所困扰.那么我可以以编程方式执行此操作吗?
我无法在运行时修改配置节,因为它们是只读的.我知道如果我得到客户端代理的实例(即ClientBase),我可以向其Endpoint.Behaviors添加我的自定义行为的实例.但是,我必须为每个实例执行此操作.
我是否可以全局访问端点并预先添加它们(例如,在Global.asax中),或者这些端点是否被实例化并暂时丢弃?
我有一个Parent/Child类层次结构,其中Parent抽象地声明了一个字符串属性,而Child类实现了它:
abstract class Parent
{
public abstract string Value { get; }
}
class Child : Parent
{
public override string Value { get { return null; } }
}
Run Code Online (Sandbox Code Playgroud)
当我使用一个显式(或隐式)使用Child类的表达式时,我希望Expressions的MemberInfo的DeclaringType为'Child',而是它是Parent:
Child child = new Child();
Expression<Func<string>> expression = (() => child.Value);
MemberInfo memberInfo = expression.GetMemberInfo();
Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS!
Run Code Online (Sandbox Code Playgroud)
断言失败,因为DeclaringType是Parent.
在声明我的表达或消费它以揭示Child类型的实际用途时,我能做些什么吗?
注意:上面的GetMemberInfo()作为扩展方法(我甚至忘了我们写过这个!):
public static class TypeExtensions
{
/// <summary>
/// Gets the member info represented by an expression.
/// </summary>
/// <param name="expression">The member expression.</param>
/// <returns>The member info …Run Code Online (Sandbox Code Playgroud) 我想以编程方式访问静态资源,就像在XAML中一样:
<TextBlock Text="{Binding Source={StaticResource My.Text.Key}}" />
Run Code Online (Sandbox Code Playgroud)
无论我的静态资源是在TextBlock,某些父元素(例如UserControl)甚至应用程序上定义的,这都有效.似乎StaticResource绑定表达式知道如何向上走元素树,或者元素本身如何.我想以编程方式执行相同的操作:
<UserControl x:Class="MyCustomControl" ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources.xaml"/> <!-- Sets 'My.Text.Key' to System.String 'Hello, World!' -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
</UserControl>
public partial class MyCustomControl
{
public MyCustomControl()
{
InitializeComponent();
string myCustomValue = this.Resources[MyCustomValue] as string; // myCustomValue becomes null!
}
}
Run Code Online (Sandbox Code Playgroud)
即使在这个简单的测试中,我的资源似乎无法以编程方式访问.这是我尝试真正做的简化版本:通过附加自定义动态属性的元素找到静态资源(例如uiElement.Resources [key]).
我在网上找到了我的问题的混合答案.详细说明问题:
我发现很多博主和论坛海报相互矛盾.任何人都可以指出任何明确的消息来源或证据来一劳永逸地回答这个问题吗?
我需要引用包含我的Visual Studio T4模板的项目引用的其中一个程序集中的Type.但是,引用的程序集是从NuGet包安装的.随着Nuget引用的发展,NuGet将其放入我的解决方案的packages文件夹中的路径也将如此.例如,假设我的NuGet包是:
那么从我的项目到它的相对路径是:
如果预发行版更新为测试版,则该路径将更改.当包被释放时,路径将改变.每次路径更改时,我的*.tt文件中的装配线都已过时:
我认为没有办法直接用汇编指令完成这个任务; 但是,我对一些疯狂的想法持开放态度.我可以将程序集自己加载到当前,或者是从属或仅反射的AppDomain吗?
我想我可以,但我不确定如何使用T4逻辑动态发现项目引用中引用程序集的路径.
有任何想法吗?
我正在运行一个Windows服务(Hudson),它反过来生成一个PowerShell进程来运行我的自定义PowerShell命令.我的部分脚本是使用CopyHere解压缩文件.当我在本地运行此脚本时,我会看到在提取和复制文件时弹出一个进度对话框.但是,当它在服务下运行时,它会挂起,否则会出现一个对话框.
这是我脚本的解压缩部分.
# Extract the contents of a zip file to a folder
function Extract-Zip {
param([string]$zipFilePath, [string]$destination)
if(test-path($zipFilePath)) {
$shellApplication = new-object -com shell.application
$zipFile = get-item $zipFilePath
$zipFolder = $shellApplication.NameSpace($zipFile.fullname)
$destinationFile = get-item $destination
$destinationFolder = $shellApplication.NameSpace($destinationFile.fullname)
$destinationFolder.CopyHere($zipFolder.Items())
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑,因为它在一个无头的服务过程中运行(没有与桌面交互),所以它不知何故试图显示一个对话框.
有没有解决的办法?
我正在使用Hudson作为持续集成服务器.这些工作最终将启动MSBuild.每个人偶尔,我的构建失败,出现MSBuild的非代码编译错误:
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2703,9): error MSB3021: Unable to copy file "..\Lib\Microsoft\Microsoft.Practices.Unity.Configuration.dll" to "bin\Debug\Microsoft.Practices.Unity.Configuration.dll". Access to the path 'bin\Debug\Microsoft.Practices.Unity.Configuration.dll' is denied.
Run Code Online (Sandbox Code Playgroud)
当我检查'bin\Debug\Microsoft.Practices.Unity.Configuration.dll'时,我发现它是一个0字节的文件.
我不知道为什么这个文件有问题.有任何想法吗?
我正在尝试使用ILMerge将一些可传递引用的程序集内化到我正在引用的程序集中,以消除与我的项目中的那些传递依赖项的冲突.
特别是,我引用了Antlr3.StringTemplate(以下简称AS,可在此处获取:http://www.stringtemplate.org/download.html).它引用了Antlr3.Runtime.Debug(ARD)和Antlr3.Runtime(AR).ARD本身也引用了AR.在ASCII艺术中,那是:
AS ---> ARD
\ |
\ v
\---> AR
Run Code Online (Sandbox Code Playgroud)
因为我正在使用的另一个程序集NHibernate 2.1依赖于不同的,不兼容的AR版本,我想使用ILMerge将AR合并并内化到AS中.从理论上讲,我认为这应该有效; 但是,我在执行理论时遇到了麻烦.
无论我尝试什么样的排列和选项,我最终都会遇到以下形式的错误:
ILMerge.Merge:程序集'Antlr3.Runtime.Debug'未正确合并.它仍然在目标程序集中列为外部引用.
我想用ILMerge完成的是什么?