Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VSIX extension - How can I ensure a referenced dll or assembly is included in the VSIX file?

When a user installs my extension, but does not have the latest Visual Studio update installed, the extension fails to resolve Microsoft.CodeAnalysis.CSharp.dll with the followeing message:

Could not load file or assembly 'Microsoft.CodeAnalysis.CSharp, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

I made sure that the extension does in fact reference this assembly, and it does, but why would this assembly be excluded from the VSIX file?

I renamed the VSIX file to a ZIP, looked at the contents, but this assembly is not shipped, even though other "Microsoft.CodeAnalysis.*.dll" assemblies are included in the VSIX file.

I also confirmed that the "Copy Local" property on the reference is True.

like image 397
Martin Lottering Avatar asked Feb 13 '17 10:02

Martin Lottering


2 Answers

For anyone who doesnt like to add the references for missing dlls i found the following which works perfectly

https://www.cazzulino.com/include-dlls-in-vsix.html

I added the following to end of my .csproj and all missing dlls ended up in the .vsix

<PropertyGroup>
    <GetVsixSourceItemsDependsOn>$(GetVsixSourceItemsDependsOn);IncludeNuGetResolvedAssets</GetVsixSourceItemsDependsOn>
</PropertyGroup>
<Target Name="IncludeNuGetResolvedAssets" DependsOnTargets="ResolveNuGetPackageAssets">
    <ItemGroup>
        <VSIXCopyLocalReferenceSourceItem Include="@(ReferenceCopyLocalPaths)"  />
    </ItemGroup>
</Target>
like image 151
Danhol86 Avatar answered Sep 20 '22 21:09

Danhol86


I found a solution to this problem, and I can see the dll now included in the VSIX and a user confirmed that it works for him.

  1. In Visual Studio, with the extension solution open,
  2. double click the .vsixmanifest file
  3. Open the "Assets" tab
  4. Click "New"
  5. Set Type to "Microsoft.VisualStudio.Assembly"
  6. Set Source to "A File on FileSystem"
  7. Click Browse to set Path to your dll, (don't worry the reference is not added as an absolute path, but added as a relative path or just a strong assembly name)
  8. You can leave "Embed in this folder" empty.
  9. Click OK
  10. Rebuild the solution, and the file should be in the VSIX file now.

enter image description here

This line is then added to the vsixmanifest file:

<Asset Type="Microsoft.VisualStudio.Assembly" d:Source="File" Path="Microsoft.CodeAnalysis.CSharp.dll" AssemblyName="Microsoft.CodeAnalysis.CSharp, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
like image 38
Martin Lottering Avatar answered Sep 20 '22 21:09

Martin Lottering