问题如下:我的VS2015方案有几个项目,其中A和B。
A 是一个常规项目,包含一个程序/服务/代码,可以将某些源文件转换为已编译的资源(其想法是源可人工维护并受源控制,但生成的资源是机器优化的但不在源下)控制)。
项目 B 包含一个这样的源文件,而不是逐字放在项目 B 的结果程序集中,我希望 A 中的程序将其“编译”成一个资源文件,并只将其放入程序集 B(以及项目 B 中的其他代码)正常编译)。
+-------------------+ +-----------------+
|Project A | |Assembly A |
| | +----------------> | |
| | | |
+-------------------+ +-------+---------+
|
|
+--------------------------------+------+
| |
+-------------------+ +-----------------+
|Project B | | |Assembly B | |
| +----+---+ | +-----v--+
| |src.txt|| +----------------> | |res.txt||
| | || | | ||
| +--------| | +--------|
+-------------------+ +-----------------+
如何在 Visual Studio 2015 中做到这一点?
最佳答案
您可以使用 Visual Studio 自定义工具而不是构建前/构建后步骤来实现这一点。这实际上不像设计器转换那样是编译步骤,但仍应解决我认为您要问的问题。这将创建一个自定义代码生成器,类似于 Visual Studio 如何将 .resx 设计器中的资源字符串转换为可编译的 C# 代码。
您没有指定您的目标是什么版本的 .NET,但这假设您的目标是 .NET 4.5。有一个 good tutorial here用于创建您自己的自定义工具,这是以下内容的基础。请注意,该文章是为 Visual Studio 2012 编写的,因此某些注册表项有所不同。
所有这一切的总结:
Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGenerator
在项目 A 中。这可以做任何你正在做的从 src.txt
转换的工作。输入文件到 res.txt
输出文件。 src.txt
的属性在项目 B 中使用您的自定义工具。从现在开始,每次保存或修改src.txt
, Visual Studio 将生成您的 res.txt
为你,你可以嵌入到你的程序集 B 或任何你喜欢的。请记住,如果您稍后需要对项目 A 进行更改,则需要重复步骤 2 并重新启动 VS。 实现代码生成器:
[assembly: ComVisible(false)]
至 [assembly: ComVisible(true)]
[ComVisible(true)]
[Guid("C43E4E36-289C-40C8-9B87-7F79E2B57B0E")] // TODO: replace with your own random GUID
public class MyResConverter : Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGenerator
{
public override string GetDefaultExtension()
{
// TODO: file extension of the resulting resource file
return ".res.txt";
}
protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
{
// TODO: your "compile" step that converts `src.txt` to `res.txt`
return Encoding.UTF8.GetBytes(inputFileContent.ToUpper());
}
}
注册您的代码生成器:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /codebase C:\Path\To\ProjectA.dll
Windows Registry Editor Version 5.00
; TODO: Replace with your GUID
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config\CLSID\{C43E4E36-289C-40C8-9B87-7F79E2B57B0E}]
"InprocServer32"="C:\\Windows\\System32\\mscoree.dll"
"ThreadingModel"="Both"
"Class"="ProjectA.MyResConverter"
; TODO: Replace with your assembly
"Assembly"="ProjectA, Version=1.0.0.0, Culture=neutral"
; TODO: Replace with your dll file
"CodeBase"="file:///C:\\Path\\To\\ProjectA.dll"
; TODO: Replace with your tool name
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0_Config\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\MyResConverter]
; TODO: Replace with your GUID
"CLSID"="{C43E4E36-289C-40C8-9B87-7F79E2B57B0E}"
"GeneratesDesignTimeSource"=dword:00000001
; TODO: Replace with your description
@="My Custom Tool"
14.0_Config
关键,因为这是 VS2015。 {FAE...
string 是 C# 代码生成器的 GUID,与您为自定义代码生成器创建的任何 GUID 无关。 使用您的自定义工具:
src.txt
在项目 B 中,然后属性 MyResConverter
src.txt
文件以生成初始转换后的资源文件(只需打开 src.txt
并单击文件 > 保存以强制运行代码生成器)。您现在应该看到 src.res.txt
在您的 src.txt
下方.您可以更改生成文件的属性,将其作为资源嵌入到您的程序集中,或者您想要的任何内容。 从现在开始,无论何时修改
src.txt
, VS 会为你重新生成资源文件,你可以将其嵌入到你的项目 B 中。
关于c# - 作为构建步骤,如何从解决方案中的项目之一运行程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40473095/