# Castle Core Changelog

## 4.4.0 (2019-04-05)

Enhancements:
- Added trace logging level below Debug; maps to Trace in log4net/NLog, and Verbose in Serilog (@pi3k14, #404)
- Recognize read-only parameters by the `In` modreq (@zvirja, #406)
- DictionaryAdapter: Exposed GetAdapter overloads with NameValueCollection parameter in .NET Standard (@rzontar, #423)
- Ability to add delegate mixins to proxies using `ProxyGenerationOptions.AddDelegate[Type]Mixin`. You can bind to the mixed-in `Invoke` methods on the proxy using `ProxyUtil.CreateDelegateToMixin`. (@stakx, #436)
- New `IInvocation.CaptureProceedInfo()` method to enable better implementations of asynchronous interceptors (@stakx, #439)

Deprecations:
- The API surrounding `Lock` has been deprecated. This consists of the members listed below. Consider using the Base Class Library's `System.Threading.ReaderWriterLockSlim` instead. (@stakx, #391)
   - `Castle.Core.Internal.Lock` (class)
   - `Castle.Core.Internal.ILockHolder` (interface)
   - `Castle.Core.Internal.IUpgradeableLockHolder` (interface)
- You should no longer manually emit types into DynamicProxy's dynamic assembly. For this reason, the following member has been deprecated. (@stakx, #445)
   - `Castle.DynamicProxy.ModuleScope.DefineType` (method)
- The proxy type cache in `ModuleScope` should no longer be accessed directly. For this reason, the members listed below have been deprecated. (@stakx, #391)
   - `Castle.DynamicProxy.ModuleScope.Lock` (property)
   - `Castle.DynamicProxy.ModuleScope.GetFromCache` (method)
   - `Castle.DynamicProxy.ModuleScope.RegisterInCache` (method)
   - `Castle.DynamicProxy.Generators.BaseProxyGenerator.AddToCache` (method)
   - `Castle.DynamicProxy.Generators.BaseProxyGenerator.GetFromCache` (method)
   - `Castle.DynamicProxy.Generators.CacheKey` (class)
   - `Castle.DynamicProxy.Serialization.CacheMappingsAttribute.ApplyTo` (method)
   - `Castle.DynamicProxy.Serialization.CacheMappingsAttribute.GetDeserializedMappings` (method)

## 4.3.1 (2018-06-21)

Enhancements:
 - Use shared read locking to reduce lock contention in InvocationHelper and ProxyUtil (@TimLovellSmith, #377)

Bugfixes:
- Prevent interceptors from being able to modify `in` parameters (@stakx, #370)
- Make default value replication of optional parameters more tolerant of default values that are represented in metadata with a mismatched type (@stakx, #371)
- Fix a concurrency issue (writing without taking a write lock first) in `BaseProxyGenerator.ObtainProxyType` (@stakx, #383)

Deprecations:
- `Castle.DynamicProxy.Generators.Emitters.ArgumentsUtil.IsAnyByRef` (@stakx, #370)

## 4.3.0 (2018-06-07)

Enhancements:
- Added .NET Standard/.NET Core support for NLog (@snakefoot, #200)
- Added .NET Standard/.NET Core support for log4net (@snakefoot, #201)
- DynamicProxy supported C# `in` parameter modifiers only on the .NET Framework up until now. Adding .NET Standard 1.5 as an additional target to the NuGet package makes them work on .NET Core, too (@stakx, #339)
- Replicate custom attributes on constructor parameters in the generated proxy type constructors to fulfill introspection of constructors. This does not change the proxying behavior. (@stakx, #341)
- Improve performance of InvocationHelper cache lookups (@tangdf, #358)
- Improve fidelity of default value replication of optional parameters to fulfill inspection of the generated proxies. This does not change the proxying behavior. (@stakx, #356)
- Improve cache performance of MethodFinder.GetAllInstanceMethods (@tangdf, #357)

Bugfixes:
- Fix Castle.Services.Logging.Log4netIntegration assembly file name casing which breaks on Linux (@beginor, #324)
- Fix Castle.DynamicProxy.Generators.AttributesToAvoidReplicating not being thread safe (InvalidOperationException "Collection was modified; enumeration operation may not execute.") (@BrunoJuchli, #334)
- Fix TraceLoggerFactory to allow specifying the default logger level (@acjh, #342)
- Ensure that DynamicProxy doesn't create invalid dynamic assemblies when proxying types from non-strong-named assemblies (@stakx, #327)
- Fix interceptor selectors being passed `System.RuntimeType` for class proxies instead of the target type (@stakx, #359)
- Replace NullReferenceException with descriptive one thrown when interceptors swallow exceptions and cause a null value type to be returned (@jonorossi, #85)

## 4.2.1 (2017-10-11)

Bugfixes:
- Add missing equality checks in `MethodSignatureComparer.EqualSignatureTypes` to fix `TypeLoadException`s ("Method does not have an implementation") (@stakx, #310)
- Add missing XML documentation files to NuGet packages (@fir3pho3nixx, #312)

## 4.2.0 (2017-09-28)

Enhancements:
- Add IProxyTargetAccessor.DynProxySetTarget to set the target of a proxy (@yallie, #293)
- Internal dynamic proxy fields are now private instead of public (@spencercw, #260)

Bugfixes:
- Make ProxyUtil.IsAccessible(MethodBase) take into account declaring type's accessibility so it doesn't report false negatives for e.g. public methods in inaccessible classes. (@stakx, #289)
- Fix InvalidCastException calling IChangeProxyTarget.ChangeProxyTarget proxying generic interfaces (@yallie, #293)
- Ignore minor/patch level version for AssemblyVersionAttribute as this creates binding errors for downstream libraries (@fir3pho3nixx, #288)
- Fix DictionaryAdapter firing NotifyPropertyChang(ed/ing) events after CancelEdit (@Lakritzator, #299)
- Fix ArgumentException when overriding method with nested generics (@BitWizJason, #297)
- Explicit package versioning applied within solution to avoid maligned NuGet upgrades for lock step versioned packages. (@fir3pho3nixx, #292)

Deprecations:
- IChangeProxyTarget.ChangeProxyTarget is deprecated in favor of IProxyTargetAccessor.DynProxySetTarget (@yallie, #293)

## 4.1.1 (2017-07-12)

Bugfixes:
- Prevent member name collision when proxy implements same generic interface more than twice (@stakx, #88)
- Fix incorrect replication (reversed order) of custom modifiers (modopts and modreqs) on the CLR, does not work yet on Mono (@stakx, #277)
- Fix COM interface proxy error case throwing exceptions trying to release null pointer from QueryInterface (@stakx, #281)

## 4.1.0 (2017-06-11)

Breaking Changes:
- Remove AllowPartiallyTrustedCallersAttribute, which wasn't defined by default (@fir3pho3nixx, #241)
- Upgrade log4net to v2.0.8 (@fir3pho3nixx, #241)

Enhancements:
- Add ProxyUtil.IsAccessible to check if a method is accessible to DynamicProxyGenAssembly2 (Blair Conrad, #235)
- Refactor build engineering to support AppVeyor and TravisCI (@fir3pho3nixx, #241)

Bugfixes:
- Fix order of class proxy constructor arguments when using multiple mixins (@sebastienros, #230)
- Fix dependency on "System.ComponentModel.TypeConverter" NuGet package version that does not exist (#239)
- Fix ParamArrayAttribute not being replicated in proxy (@stakx, #121)
- Fix System.Net.Mail.SmtpClient is obsolete on Mono warning (#254)

## 4.0.0 (2017-01-25)

Breaking Changes:
- Update to NLog 4.4.1 and remove beta .NET Core support for NLog (#228)
- Update to log4net 2.0.7 (#229)

Bugfixes:
- Fix CustomAttributeInfo.FromExpression for VB.NET (@thomaslevesque, #223)

## 4.0.0-beta002 (2016-10-28)

Breaking Changes:
- Rework Serilog integration to accept an ILogger rather than a LoggerConfiguration  to work correctly with Serilog (#142, #211)
- Remove obsolete property `AttributesToAddToGeneratedTypes` from `ProxyGenerationOptions` (#219)
- Change type of `ProxyGenerationOptions.AdditionalAttributes` to `IList<CustomAttributeInfo>` (#219)
- Remove `IAttributeDisassembler` which is no longer necessary (#219)

Enhancements:
- Add IProxyGenerator interface for the ProxyGenerator class (#215)
- Improve default list of attributes to avoid replicating. Code Access Security attributes and MarshalAsAttribute will no longer be replicated (#221)

Bugfixes:
- Fix building on Mono 4.6.1
- Different attributes in `ProxyGenerationOptions.AdditionalAttributes` now generates different proxy types (#219)

## 4.0.0-beta001 (2016-07-17)

Breaking Changes:
- Update to log4net 1.2.15/2.0.5 (#199)
- Update to NLog 4.4.0-beta13 (#199)
- Update to Serilog 2.0.0 (#199)

Enhancements:
- .NET Core 1.0 and .NET Standard 1.3 support (Jonathon Rossi, Jeremy Meng)
- Restore DynamicDictionary class

Bugfixes:
- Fix target framework moniker in NuGet package for .NET Core (#174)

## 4.0.0-alpha001 (2016-04-07)

Breaking Changes:
- Remove all Silverlight support (#100, #150)
- Remove DynamicProxy's RemotableInvocation and remoting support for invocations (#110, #65)

Enhancements:
- .NET Core DNX and dotnet5.4 support via feature conditional compilation (Jonathon Rossi, Jeremy Meng)
- Build script improvements and consolidate version numbers (Blair Conrad, #75, #152, #153)

Bugfixes:
- Fix 'System.ArgumentException: Constant does not match the defined type' with optional, nullable enum method parameters (Daniel Yankowsky, #141, #149)
- Fix proxy generation hook notification for virtual but final methods (Axel Heer, #148)
- Fix InvalidCastException with custom attribute having an enum array parameter with non-int enum (@csharper2010, #104, #105)
- Update to Mono 4.0.2 and improve Mono support (#79, #95, #102)
- Fix 'System.ArrayTypeMismatchException: Source array type cannot be assigned to destination array type' on Mono (#81)
- Fix 'System.ArgumentException: System.Decimal is not a supported constant type' with optional method parameters (@fknx, #87, #91)
- Fix ProxyGenerator cache does not take into account AdditionalAttributes (@cmerat, #77, #78)
- Fix Castle.Services.Logging.SerilogIntegration.dll missing some assembly info attributes (@imzshh, #20, #82)

## 3.3.3 (2014-11-06)
- Fix Serilog integration modifies LoggerConfiguration.MinimumLevel (#70)
- Add SourceContext to the Serilog logger (@KevivL, #69)

## 3.3.2 (2014-11-03)
- fixed #66 - SerilogLogger implementation bug where exceptions were passed through incorrectly

## 3.3.1 (2014-09-10)
- implemented #61 - Added support for Serilog - contributed by Russell J Baker (@ruba1987)

## 3.3.0 (2014-04-27)
- implemented #51 - removed abandoned projects: Binder, Pagination, Validator
- implemented #49 - build NuGet and Zip packages from TeamCity - contributed by Blair Conrad (@blairconrad)
- implemented #42 - move complicated BuildInternalsVisibleMessageForType method out of DynamicProxyBuilder - contributed by Blair Conrad (@blairconrad)
- fixed #47 - Calling DynamicProxy proxy methods with multidimensional array parameters - contributed by  Ed Parcell (@edparcell)
- fixed #44 - DictionaryAdapter FetchAttribute on type has no effect
- fixed #34 and #39 - inaccessible type parameters should give better error messages - contributed by Blair Conrad (@blairconrad)

## 3.2.2 (2013-11-30)
- fixed #35 - ParameterBuilder.SetConstant fails when using a default value of null - contributed by (@jonasro)

## 3.2.1 (2013-10-05)
- fixed #32 - Improve configuration of SmtpClient in sync sending - contributed by Artur Dorochowicz (@ArturDorochowicz)
- fixed #31 - [DynamicProxy] Preserve DefaultValues of proxied method's parameters (in .NET 4.5)
- fixed #30 - tailoring InternalsVisibleTo message based on assembly of inaccessible type - contributed by Blair Conrad (@blairconrad)
- fixed #27 - Allow dynamic proxy of generic interfaces which have generic methods, under Mono 2.10.8 and Mono 3.0.6 - contributed by Iain Ballard (@i-e-b)
- fixed #26 - Proxy of COM class issue, reference count incremented - contributed by Jean-Claude Viau (@jcviau)
- fixed DYNPROXY-188 - CreateInterfaceProxyWithoutTarget fails with interface containing member with 'ref UIntPtr' - contributed by Pier Janssen (@Pjanssen)
- fixed DYNPROXY-186 - .Net remoting (transparent proxy) cannot be proxied - contributed by Jean-Claude Viau (@jcviau)
- fixed DYNPROXY-185 - ProxyUtil.GetUnproxiedInstance returns proxy object for ClassProxyWithTarget instead of its target - contributed by Dmitry Xlestkov (@d-s-x)

## 3.2.0 (2013-02-16)
- fixed DYNPROXY-179 - Exception when creating a generic proxy (from cache)
- fixed DYNPROXY-175 - invalid CompositionInvocation type used when code uses interface proxies with and without InterceptorSelector

## 3.1.0 (2012-08-05)
- fixed DYNPROXY-174 - Unable to cast object of type 'System.Collections.ObjectModel.ReadOnlyCollection\`1[System.Reflection.CustomAttributeTypedArgument]' to type 'System.Array'

## 3.1.0 RC (2012-07-08)
- support multiple inheritance of DA attributes on interfaces.
- BREAKING CHANGE: removed propagated child notifications as it violated INotifyPropertyChanged contract
- improved DictionaryAdapter performance
- generalized IBindingList support for DictionaryAdapters
- added reference support to XmlAdapter
- BREAKING CHANGE: refactored XPathAdapter into XmlAdapter with much more flexibility to support other input like XLinq
- implemented CORE-43 - Add option to skip configuring log4net/nlog
- fixed CORE-44 - NLog logger does not preserver call site info
- fixed DYNPROXY-171 - PEVerify error on generic method definition
- fixed DYNPROXY-170 - Calls to properties inside non-intercepted methods are not forwarded to target object (regression from v2.5)
- fixed DYNPROXY-169 - Support IChangeProxyTarget on additional interfaces and mixins when using CreateInterfaceProxyWithTargetInterface

## 3.0.0 (2011-12-13)
- no major changes since RC

## 3.0.0 RC 1 (2011-11-20)
- Applied Jeff Sharps patch that refactored Xml DictionaryAdapter to improve maintainability and enable more complete functionality
- fixed DYNPROXY-165 - Object.GetType() and Object.MemberwiseClone() should be ignored and not reported as non-interceptable to IProxyGenerationHook
- fixed DYNPROXY-164 - Invalid Proxy type generated when there are more than one base class generic constraints
- fixed DYNPROXY-162 - ref or out parameters can not be passed back if proxied method throw an exception

## 3.0.0 beta 1 (2011-08-14)

Breaking Changes:
* Removed overloads of logging methods that were taking format string from ILogger and ILogger and IExtendedLogger and didn't have word Format in their name.
  * For example:
    * void Error(string format, params object[] args); // was removed
    * void ErrorFormat(string format, params object[] args); //use this one instead
  * impact - low
  * fixability - medium
  * description - To minimize confusion and duplication those methods were removed.
  * fix - Use methods that have explicit "Format" word in their name and same signature.
* Removed WebLogger and WebLoggerFactory
  * impact - low
  * fixability - medium
  * description - To minimize management overhead the classes were removed so that only single Client Profile version of Castle.Core can be distributed.
  * fix - You can use NLog or Log4Net web logger integration, or reuse implementation of existing web logger and use it as a custom logger.
* Removed obsolete overload of ProxyGenerator.CreateClassProxy
  * impact - low
  * fixability - trivial
  * description - Deprecated overload of ProxyGenerator.CreateClassProxy was removed to keep the method consistent with other methods and to remove confusion
  * fix - whenever removed overload was used, use one of the other overloads.
* IProxyGenerationHook.NonVirtualMemberNotification method was renamed
  * impact - high
  * fixability - easy
  * description - to accommodate class proxies with target method NonVirtualMemberNotification on IProxyGenerationHook type was renamed to more accurate
    NonProxyableMemberNotification 	since for class proxies with target not just methods but also fields and other member that break the abstraction will
    be passed to this method.
  * fix - whenever NonVirtualMemberNotification is used/implemented change the method name to
	  NonProxyableMemberNotification. Implementors should also accommodate possibility that not
	  only MethodInfos will be passed as method's second parameter.
* DynamicProxy will now allow to intercept members of System.Object
  * impact - very low
  * fixability - easy
  * description - to allow scenarios like mocking of System.Object members, DynamicProxy will not
	  disallow proxying of these methods anymore. AllMethodsHook (default IProxyGenerationHook)
	  will still filter them out though.
  * fix - whenever custom IProxyGenerationHook is used, user should account for System.Object's
	  members being now passed to ShouldInterceptMethod and NonVirtualMemberNotification methods
	  and if necessary update the code to handle them appropriately.

Bugfixes:
- fixed CORE-37 - TAB characters in the XML Configuration of a component parameter is read as String.Empty
- fixed DYNPROXY-161 - Strong Named DynamicProxy Assembly Not Available in Silverlight
- fixed DYNPROXY-159 - Sorting MemberInfo array for serialization has side effects
- fixed DYNPROXY-158 - Can't create class proxy with target and without target in same ProxyGenerator
- fixed DYNPROXY-153 - When proxying a generic interface which has an interface as GenericType . No proxy can be created
- fixed DYNPROXY-151 - Cast error when using attributes 
- implemented CORE-33 - Add lazy logging
- implemented DYNPROXY-156 - Provide mechanism for interceptors to implement retry logic
- removed obsolete members from ILogger and its implementations

## 2.5.2 (2010-11-15)
- fixed DYNPROXY-150 - Finalizer should not be proxied
- implemented DYNPROXY-149 - Make AllMethodsHook members virtual so it can be used as a base class
- fixed DYNPROXY-147 - Can't create class proxies with two non-public methods having same argument types but different return type
- fixed DYNPROXY-145 Unable to proxy System.Threading.SynchronizationContext (.NET 4.0)
- fixed DYNPROXY-144 - params argument not supported in constructor
- fixed DYNPROXY-143 - Permit call to reach "non-proxied" methods of inherited interfaces
- implemented DYNPROXY-139 - Better error message 
- fixed DYNPROXY-133 - Debug assertion in ClassProxyInstanceContributor fails when proxying ISerializable with an explicit implementation of GetObjectData
- fixed CORE-32 - Determining if permission is granted via PermissionUtil does not work in .NET 4
- applied patch by Alwin Meijs - ExtendedLog4netFactory can be configured with a stream from for example an embedded log4net xml config
- Upgraded NLog to 2.0 Beta 1
- Added DefaultXmlSerializer to bridge XPathAdapter with standard Xml Serialization.
- XPathAdapter for DictionaryAdapter added IXPathSerializer to provide hooks for custom serialization.

## 2.5.1 (2010-09-21)
- Interface proxy with target Interface now accepts null as a valid target value (which can be replaced at a later stage).
- DictionaryAdapter behavior overrides are now ordered with all other behaviors
- BREAKING CHANGE: removed web logger so that by default Castle.Core works in .NET 4 client profile
- added parameter to ModuleScope disabling usage of signed modules. This is to workaround issue DYNPROXY-134. Also a descriptive exception message is being thrown now when the issue is detected.
- Added IDictionaryBehaviorBuilder to allow grouping behaviors
- Added GenericDictionaryAdapter to simplify generic value sources
- fixed issue DYNPROXY-138 - Error message missing space
- fixed false positive where DynamicProxy would not let you proxy interface with target interface when target object was a COM object.
- fixed ReflectionBasedDictionaryAdapter when using indexed properties

## 2.5.0 (2010-08-21)
- DynamicProxy will now not replicate non-public attribute types
- Applied patch from Kenneth Siewers Møller which adds parameterless constructor to DefaultSmtpSender implementation, to be able to configure the inner SmtpClient from the application configuration file (system.net.smtp).
- added support for .NET 4 and Silverlight 4, updated solution to VisualStudio 2010
- Removed obsolete overload of CreateClassProxy
- Added class proxy with target
- Added ability to intercept explicitly implemented generic interface methods on class proxy.
- DynamicProxy does not disallow intercepting members of System.Object anymore. AllMethodsHook will still filter them out though.
- Added ability to intercept explicitly implemented interface members on class proxy. Does not support generic members.
- Merged DynamicProxy into Core binary
- fixed DYNPROXY-ISSUE-132 - "MetaProperty equals implementation incorrect"
- Fixed bug in DiagnosticsLoggerTestCase, where when running as non-admin, the teardown will throw SecurityException (contributed by maxild)
- Split IoC specific classes into Castle.Windsor project
- Merged logging services solution
- Merged DynamicProxy project

## 1.2.0 (2010-01-11)
- Added IEmailSender interface and its default implementation

## 1.2.0 beta (2009-12-04)
- BREAKING CHANGE - added ChangeProxyTarget method to IChangeProxyTarget interface
- added docs to IChangeProxyTarget methods
- Fixed DYNPROXY-ISSUE-108 - Obtaining replicated custom attributes on proxy may fail when property setter throws exception on default value
- Moved custom attribute replication from CustomAttributeUtil to new interface - IAttributeDisassembler
- Exposed IAttributeDisassembler via ProxyGenerationOptions, so that users can plug their implementation for some convoluted scenarios. (for Silverlight)
- Moved IInterceptorSelector from Dynamic Proxy to Core (IOC-ISSUE-156)

## 1.1.0 (2009-05-04)
- Applied Eric Hauser's patch fixing CORE-ISSUE-22
  "Support for environment variables in resource URI"
- Applied Gauthier Segay's patch fixing CORE-ISSUE-20
  "Castle.Core.Tests won't build via nant because it use TraceContext without referencing System.Web.dll"
- Added simple interface to ComponentModel to make optional properties required. 
- Applied Mark's -- <mwatts42@gmail.com> -- patch that changes 
  the Core to support being compiled for Silverlight 2
- Applied Louis DeJardin's patch adding TraceLogger as a new logger implementation
- Applied Chris Bilson's patch fixing CORE-15
  "WebLogger Throws When Logging Outside of an HttpContext"

## Release Candidate 3
- Added IServiceProviderEx which extends IServiceProvider
- Added Pair<T,S> class. 
- Applied Bill Pierce's patch fixing CORE-9 
  "Allow CastleComponent Attribute to Specify Lifestyle in Constructor"
- Added UseSingleInterfaceProxy to CompomentModel to control the proxying
  behavior while maintaining backward compatibility.
  Added the corresponding ComponentProxyBehaviorAttribute.
- Made NullLogger and IExtnededLogger
- Enabled a new format on ILogger interface, with 6 overloads for each method:
  - Debug(string)
  - Debug(string, Exception)
  - Debug(string, params object[])
  - DebugFormat(string, params object[])
  - DebugFormat(Exception, string, params object[])
  - DebugFormat(IFormatProvider, string, params object[])
  - DebugFormat(IFormatProvider, Exception, string, params object[])
  - The "FatalError" overloads where marked as [Obsolete], replaced by "Fatal" and "FatalFormat".

## 0.0.1.0
- Included IProxyTargetAccessor
- Removed IMethodInterceptor and IMethodInvocation, that have been replaced by IInterceptor and IInvocation
- Added FindByPropertyInfo to PropertySetCollection
- Made the DependencyModel.IsOptional property writable
- Applied Curtis Schlak's patch fixing IOC-27
  "assembly resource format only works for resources where the assemblies name and default namespace are the same."
  
  Quoting:

  "I chose to preserve backwards compatibility by implementing the code in the 
  reverse order as suggested by the reporter. Given the following URI for a resource:

  assembly://my.cool.assembly/context/moo/file.xml

  It will initially look for an embedded resource with the manifest name of 
  "my.cool.assembly.context.moo.file.xml" in the loaded assembly my.cool.assembly.dll. 
  If it does not find it, then it looks for the embedded resource with the manifest name 
  of "context.moo.file.xml".
- IServiceEnabledComponent Introduced to be used across the project as
  a standard way to have access to common services, for example, logger factories
- Added missing log factories
- Refactor StreamLogger and DiagnosticLogger to be more consistent behavior-wise
- Refactored WebLogger to extend LevelFilteredLogger (removed duplication)
- Refactored LoggerLevel order
- Project started
