我已经追踪到发生了什么。由于这将是一个冗长的帖子,我将做出一个新的答案来解释问题@ThBlitz
这不是答案,而是对上述问题的进一步解释,我为篇幅道歉。
所以我已经设置了一个 IWizard 实现来修改 csproj 并且正如与@Sayed 讨论的那样,我已经尝试了他的解决方案。这是我的发现。
这是实现中有趣的IWizard
部分
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
replacementsDictionary.Add("$companynamespace$", "Infomedia");
}
和_preprocess.xml
<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
<TemplateInfo Path="CSharp\Infomedia"/>
<Replacements Include="*.*" Exclude="*.vstemplate;*.csproj;*.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
<add key="ConsoleApp" value="$safeprojectname$"/>
<add key="RootNamespace" value="$companynamespace$.$safeprojectname$"/>
<add key="AssemblyName" value="$companynamespace$.$safeprojectname$"/>
<add key="namespace" value="namespace $companynamespace$.$safeprojectname$"/>
</Replacements>
</Preprocess>
命名空间部分只是为了测试向导是否被执行,确实如此,因为我可以观察到实验 VS 中模板中所有类中命名空间的变化。(然后类无效,但至少它显示了向导的执行)。
但它应该改变RootNamespace
and并且要做到这一点,Assemblyname
我需要删除*.csproj
_preprocess.xml
执行此更改会使 xml 无效。清洗示例_preprocess.xml
<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
<TemplateInfo Path="CSharp\Infomedia"/>
<Replacements Include="*.*" Exclude="*.vstemplate;*.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
<add key="ConsoleApp" value="$safeprojectname$"/>
<add key="RootNamespace" value="$companynamespace$.$safeprojectname$"/>
<add key="AssemblyName" value="$companynamespace$.$safeprojectname$"/>
<add key="namespace" value="namespace $companynamespace$.$safeprojectname$"/>
</Replacements>
</Preprocess>
观察删除*.csproj
构建解决方案将导致编译错误:
Name cannot begin with the '$' character, hexadecimal value 0x24. Line 10, position 6.
行。所以现在的问题是存在$
和删除它们,任何空格都将允许构建解决方案,但是替换当然不起作用,因为找不到替换值。
修改后的 xml 生成但不起作用。
<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
<TemplateInfo Path="CSharp\Infomedia"/>
<Replacements Include="*.*" Exclude="*.vstemplate;*.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
<add key="ConsoleApp" value="$safeprojectname$"/>
<add key="RootNamespace" value="companynamespace.safeprojectname"/>
<add key="AssemblyName" value="companynamespace.safeprojectname"/>
<add key="namespace" value="companynamespace.safeprojectname"/>
</Replacements>
</Preprocess>
所以@Sayed 我真的希望你对这里发生的事情有所了解。