Share via


Locate Unused Code - VS2015/2017

Question

Friday, January 11, 2019 9:54 PM

Is there a way to locate unused code (classes, functions, subs) on Visual Studio Community 2015/2017, I know I can check where it is used, but I´m looking for the opposite.
I know this can be achieved with Reshaper, NDepend and some other external tools, but I´m lookig for a native solution or free tool, not by trial time

Thanks

All replies (13)

Tuesday, January 29, 2019 7:15 AM ✅Answered

Hi jzero,

Maybe you could try the guide below,its a step by step guide, if you still have the problem, it maybe has something to do with your version of visual studio

http://dotnetcodepress.com/Articles/Visual-Studio/Eliminate-unused-or-Dead-code-using-Visual-Studio-Code-Analysis

Best regards,

Ackerly Xu


Tuesday, January 29, 2019 9:51 AM ✅Answered

You are using 2015 which perhaps doesn't include that. You could perhaps install 2017 to give this a try.


Saturday, January 12, 2019 5:45 PM

Hi,

Community have a "Code Analysis" feature that may detect some situation. You have "CodeLens" in Pro or Enterprise that shows a reference count. A tool would IMO show lmany false positive (for example in MVC technically speaking your actions are not called from within your code).

Done a test. Try "Analyze", "Code Analysis", enable all rules and do a check. I see it generate for example :

/en-us/visualstudio/code-quality/ca1811-avoid-uncalled-private-code?view=vs-2015


Saturday, January 12, 2019 7:41 PM

In Community "Code Analysis" if "Run Code Analysis on WebSite or Solution" it wont detect a function that I know is not used anywhere, not  a single message about that.
So, my point is, is such resource available only for PRO & Enterprise or am I expecting a result that is not available on Community?


Saturday, January 12, 2019 8:09 PM

I tried with Community. It's not part of the default rules. You have to change selected rules (for now I tried "All" for a quick test).


Sunday, January 13, 2019 1:04 AM

Thanks, know I can get some more results, but not what I was expecting.
Just as an example, I created a new Web Site, with a single Page with a Button.
On code behind, button_click and 2 functions, one is in use the other not.
After Run Analysis, I was expecting a warning about unused function, but not a single mention about it.
What am I missing?

Partial Class _Default
  Inherits System.Web.UI.Page

  Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim test As Boolean = CheckVal(1)
  End Sub

  Private Function CheckVal(ByVal n As Integer) As Boolean
    Return If(n = 1, True, False)
  End Function

  Private Function CheckStr(ByVal s As String) As Boolean
    Return If(s = "a", True, False)
  End Function
End Class

Monday, January 14, 2019 4:38 AM

Hi jzero,

Have you set the rules to all?

If not , please right click your project , choose properties, choose Code Analysis on the left  and change Run this rule set: to Microsoft All Rules.

Then Run Code Analysis  on your project .

Also , please change your Protected method to private method , or it won't show warning.

You could refer to the link for more details.

https://stackoverflow.com/questions/30974433/get-list-of-zero-reference-codes-in-visual-studio

Best regards,

Ackerly Xu


Monday, January 14, 2019 1:33 PM

@Ackerly Xu,
As pointed by @PatriceSC, and now by you, I used "All Rules", and not a single mention of Unused.
So I don´t know if in a sample like I posted it should indicate there is an Unused function or not.

Just in case change from Protected to Private does not make any result change


Tuesday, January 15, 2019 1:15 AM

Hi jzero,

I have made a test  using my visual studio enterprise, but I could get the warning.

Below is the result. It shows  the method has no upstream Public or Protected callers.

My method 

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs)

    End Sub

    Private Function CheckVal(ByVal n As Integer) As Boolean
        Return If(n = 1, True, False)
    End Function

Maybe its the version of visual studio ?Have you seen the CA1811 warning?

Best regards,

Ackerly Xu


Tuesday, January 15, 2019 11:29 AM

@Ackerly Xu
Interesting, I confirmed all rules are there, but seems it is not all rules are "operational" on Community version.
Do you believe there can be a workaround?


Tuesday, January 15, 2019 11:39 AM

I really tried in VS 2017 Community and got the CA1811 warning. Could you clarify which version you are using as you are talking about VS2015/VS2017. What if you try with Community 2017 first ? Also if you are seeing no warning at all maybe you could check in the setup that "Code Analysis" was installed ? Will try again at home with your code sample.


Tuesday, January 15, 2019 2:26 PM

@PatriceSC
I´m using VS 2015 Community, checked install, but there is no "Code Analysis" to select.
I can see warnings but none refer to CA 1801, 1803, 180 or 1811.
For sample I posted, this is what i get when on Analyze > Run Code Analysis > Run Code Analysis on Web Site (with Microsoft All Rules in place)

Code Description
Warning CA2000 In method 'default_aspx.__BuildControl__control3()', object '__ctrl' is not disposed along all exception paths. Call System.IDisposable.Dispose on object '__ctrl' before all references to it are out of scope.
Warning CA2000 : Microsoft.Reliability : In method 'default_aspx.__BuildControl__control3()', object '__ctrl' is not disposed along all exception paths. Call System.IDisposable.Dispose on object '__ctrl' before all references to it are out of scope.
Warning CA2000 In method 'default_aspx.__BuildControl__control4()', object '__ctrl' is not disposed along all exception paths. Call System.IDisposable.Dispose on object '__ctrl' before all references to it are out of scope.
Warning CA2000 : Microsoft.Reliability : In method 'default_aspx.__BuildControl__control4()', object '__ctrl' is not disposed along all exception paths. Call System.IDisposable.Dispose on object '__ctrl' before all references to it are out of scope.
Warning CA1303 Method 'default_aspx.__BuildControlButton1()' passes a literal string as parameter 'value' of a call to 'Button.Text.Set(String)'. Retrieve the following string(s) from a resource table instead: "Button".
Warning CA1303 : Microsoft.Globalization : Method 'default_aspx.__BuildControlButton1()' passes a literal string as parameter 'value' of a call to 'Button.Text.Set(String)'. Retrieve the following string(s) from a resource table instead: "Button".

Tuesday, January 29, 2019 7:46 PM

@Patrice
Yes, sounds time to move up and start working with 2017 Community.

@Ackerly Xu
Thanks for all suggestions, I´m sure they should work, but I use Community Version.
Looks 2017 Community is a solution in my case. PatriceSc confirmed it works on this version