Skip to content

Commit d78c221

Browse files
author
Marcio Rinaldi
committed
Use AssemblyReader instead of Mono Cecil
1 parent bd50a25 commit d78c221

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

src/Paket.Core/Installation/BindingRedirects.fs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ open System.Xml.Linq
77
open System.IO
88
open Paket.Xml.Linq
99
open System.Xml.XPath
10+
open System.Reflection
1011

1112
/// Represents a binding redirection
1213
type BindingRedirect =
@@ -196,9 +197,8 @@ let applyBindingRedirectsToFolder isFirstGroup createNewBindingFiles cleanBindin
196197
applyBindingRedirects p
197198

198199
/// Calculates the short form of the public key token for use with binding redirects, if it exists.
199-
let getPublicKeyToken (assembly:Mono.Cecil.AssemblyDefinition) =
200-
("", assembly.Name.PublicKeyToken)
201-
||> Array.fold(fun state b -> state + b.ToString("X2"))
202-
|> function
203-
| "" -> None
204-
| token -> Some (token.ToLower())
200+
let getPublicKeyToken (assembly:AssemblyName) =
201+
assembly.GetPublicKeyToken()
202+
|> Option.ofObj
203+
|> Option.map (Array.fold(fun state b -> state + b.ToString("X2")) "")
204+
|> Option.bind (function | "" -> None | token -> Some (token.ToLower()))

src/Paket.Core/Installation/InstallProcess.fs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ open Paket.PackageSources
1111
open Paket.Requirements
1212
open System.Collections.Generic
1313
open System
14+
open ProviderImplementation.AssemblyReader
1415

1516
let updatePackagesConfigFile (model: Map<GroupName*PackageName,SemVerInfo*InstallSettings>) packagesConfigFileName =
1617
let packagesInConfigFile = PackagesConfigFile.Read packagesConfigFileName
@@ -293,22 +294,25 @@ let private applyBindingRedirects isFirstGroup createNewBindingFiles cleanBindin
293294
librariesForPackage
294295
|> Seq.choose(fun (library,redirects,profile) ->
295296
try
296-
let assembly = Mono.Cecil.AssemblyDefinition.ReadAssembly(library.Path)
297-
Some (assembly, BindingRedirects.getPublicKeyToken assembly, assembly.MainModule.AssemblyReferences, redirects, profile)
297+
let assemblyReader =
298+
ILModuleReaderAfterReadingAllBytes(library.Path, mkILGlobals EcmaMscorlibScopeRef)
299+
let assembly = assemblyReader.ILModuleDef.ManifestOfAssembly
300+
let assemblyName = assembly.GetName()
301+
Some (assembly, BindingRedirects.getPublicKeyToken assemblyName, assemblyReader.ILAssemblyRefs, redirects, profile)
298302
with _ -> None)
299-
|> Seq.sortBy(fun (assembly,_,_,_,_) -> assembly.Name.Version)
303+
|> Seq.sortBy(fun (assembly,_,_,_,_) -> assembly.Version)
300304
|> Seq.toList
301305
|> List.rev
302306
|> function | head :: _ -> Some head | _ -> None)
303307
|> Seq.cache
304308

305-
let referencesDifferentProfiles (assemblyName : Mono.Cecil.AssemblyNameDefinition) profile =
309+
let referencesDifferentProfiles assemblyName assemblyVersion profile =
306310
(targetProfiles |> Seq.exists ((=) profile))
307311
&& assemblies
308312
|> Seq.filter (fun (_,_,_,_,p) -> p <> profile)
309-
|> Seq.map (fun (a,_,_,_,_) -> a.Name)
310-
|> Seq.filter (fun a -> a.Name = assemblyName.Name)
311-
|> Seq.exists (fun a -> a.Version <> assemblyName.Version)
313+
|> Seq.map (fun (a,_,_,_,_) -> a)
314+
|> Seq.filter (fun a -> a.Name = assemblyName)
315+
|> Seq.exists (fun a -> a.Version <> assemblyVersion)
312316

313317
assemblies
314318
|> Seq.choose (fun (assembly,token,refs,redirects,profile) ->
@@ -320,16 +324,15 @@ let private applyBindingRedirects isFirstGroup createNewBindingFiles cleanBindin
320324
| Some BindingRedirectsSettings.Off -> false
321325
| _ -> false)
322326
|> Seq.filter (fun (assembly,_,_,redirects,profile) ->
323-
let assemblyName = assembly.Name
324327
redirects = Some BindingRedirectsSettings.Force
325-
|| referencesDifferentProfiles assemblyName profile
328+
|| referencesDifferentProfiles assembly.Name assembly.Version profile
326329
|| assemblies
327330
|> Seq.collect (fun (_,_,refs,_,_) -> refs)
328-
|> Seq.filter (fun a -> assemblyName.Name = a.Name)
329-
|> Seq.exists (fun a -> assemblyName.Version > a.Version))
331+
|> Seq.filter (fun a -> assembly.Name = a.Name)
332+
|> Seq.exists (fun a -> assembly.Version > a.Version))
330333
|> Seq.map(fun (assembly, token,_,_,_) ->
331-
{ BindingRedirect.AssemblyName = assembly.Name.Name
332-
Version = assembly.Name.Version.ToString()
334+
{ BindingRedirect.AssemblyName = assembly.Name
335+
Version = Option.fold (fun _ x -> x.ToString()) "0.0.0.0" assembly.Version
333336
PublicKeyToken = token
334337
Culture = None })
335338
|> Seq.sort

0 commit comments

Comments
 (0)