views:

605

answers:

2

I have a language service that I have built for a custom file type.

In addition, I have created a custom target (build action) within my MSBuild project files. I am however unable to find any way to associate that build action by default to my custom file extension.

For example, if you add a .cs file, the build action defaults to "compile". I would like to do the same for mine. i.e. when adding a .dsl file I would like the build action to be "Generate", which is my custom target (and therefore build action).

Is there a way without using a item wizard?

A: 

Not sure about "Generate", which I guess is your 'custom build action' - But, I've been able to set any required build action programmatically using the build engine API, in a build task.

So let's say the file had build action set to 'compile', you can easily change it to whatever you like during runtime (build time) - in my case I set it to 'Embedded Resource'. This is possible by associating a custom targets file, that runs the Build Task code you could write.

Let me know if it's not clear, I can explain further, if you are interested.

Vin
Hi Vin, I have a custom target, and I can manually set the build task to that target (which is the build action). It's just when I add a new .dsl file, I would like it to automatically associate that build action to the file.
Darien Ford
+1  A: 

I think the following might help you and others who are wanting to do similar things.

If your end goal is to generate code/something when anything changes in your .dsl file, then I suggest you could use "CustomTool". It's a property on any Project Item. You write code to generate code, register the Generator assembly, then set the customtool property of the .dsl file to "MyDslToCsGenerator".

In order to register the Custom tool in VS you have to run "regasm" utility, available with .Net framework against the MyDslToCsGenerator.dll


I know you said that you don't want to use Item Template wizard, but if you've access to the custom file template, then you could set the default build action (see 1st link below)

<ProjectItem SubType="" TargetFileName="$fileinputname$.dsl" 
ReplaceParameters="true" ItemType="Embedded Resource" 
CustomTool="MyDslToCsGenerator">MyFile.dsl</ProjectItem>


You could also do this programmatically with DTE (projectItem.Properties.Item("ItemType").Value = "MyOwnBuildActionChoice") as explained in the 2nd link below

Helpful links:

  1. How to set the Build Action for an item created by a Visual Studio item template?
  2. Using DTE to set a custom build action
Vin
Vin, the first link you put up is exactly what I was looking for. Not sure how I missed it during my searches.Much appreciated!
Darien Ford