我正在开发Visual Studio扩展。扩展程序的相关VS项目模板包括对扩展程序DLL中的自定义任务的调用:
< UsingTask TaskName =" MyTask" AssemblyFile =" MyDLL.dll的路径" />
通过使用VSIX安装程序,扩展程序将安装在通常的位置。
我的问题是:是否有一个好的MSBuild属性或宏可用于构建扩展程序的DLL(即MyDLL.dll)的路径?我知道$(DevEnvDir)并且在Visual Studio 2015中使用项目和扩展时可以扩展该路径(附加\ VendorName \ ProductName \ Version),但这似乎不适用于VS 2017,附加路径使用的是一个不能提前预测的错位名称(或者可以吗?)。还有一个问题是项目/扩展应该在VS实验实例中工作,它似乎不反映$(DevEnvDir)。
使用MSBuild属性有没有好的方法,或者我需要查看环境变量或注册表等替代方案?
答案 0 :(得分:1)
使用MSBuild属性有没有好的方法,或者我需要查看环境变量或注册表等替代方案?
您可以使用环境变量或注册表来实现它。
你可以使用这样的环境变量:
<UsingTask TaskName="MyTask" AssemblyFile="$(yourenvironmentvariablesname)MyDLL.dll" />
有关详细信息,请参阅:
https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-use-environment-variables-in-a-build
你可以使用这样的注册表:
<UsingTask TaskName="MyTask" AssemblyFile="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework@DbgManagedDebugger)MyDLL.dll" />
注意:请根据需要更改相关的注册表路径。
https://blogs.msdn.microsoft.com/msbuild/2007/05/04/new-registry-syntax-in-msbuild-v3-5/
答案 1 :(得分:0)
对我来说有意义的解决方案是创建一个向导,并在替换字典中设置扩展安装位置的路径,然后将模板中的替换项与UsingTask一起使用。
public class ProjectLocationWizard : IWizard
{
public void BeforeOpeningFile(ProjectItem projectItem)
{
}
public void ProjectFinishedGenerating(Project project)
{
}
public void ProjectItemFinishedGenerating(ProjectItem projectItem)
{
}
public void RunFinished()
{
}
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
var wizardDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
replacementsDictionary.Add("$installlocation$", wizardDirectory);
}
public bool ShouldAddProjectItem(string filePath)
{
return true;
}
}
<UsingTask AssemblyFile="$installlocation$\MyTask.dll" TaskName="MyTask" />
尽管向导文档说要签署向导程序集,但我没有签署,并且如果没有,它也可以正常工作。