Release Notes for SAP .NET Connector (NCo)
==========================================


Please read the license terms and release notes carefully.

--------------------------------------------------------------------------------

This product is property of SAP SE. You are granted usage of this product in
your development environment. Deploying this product with your application in a
production environment is only valid with the sufficient amount of SAP Software
Licenses according to the terms and conditions of SAP Software.

THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
SAP SE further does not warrant the accuracy or completeness of the information,
text, graphics, links or other items contained within these materials. SAP SE
shall not be liable for any special, indirect, incidental or consequential
damages, including without limitation, lost revenues or lost profits, which may
result from the use of these materials. The information in this software is
subject to change without notice and does not represent a commitment on the
part of SAP SE in the future.

--------------------------------------------------------------------------------

Release Notes 3.0.25:
* Bugfix: connection management
  It could happen that an RfcCommunicationException was thrown, if the application tried to cancel
  a connection with a message similar to "SAP.Middleware.Connector.RfcCommunicationException:
  Connection to (appserverhost.corp,3300) with conversationID [] is closed, but cancel was not possible.
  CPIC layer returns 20". This happened, if the cancel operation was following a close of the connection,
  which is an illegal situation. This was possible due to a missing synchronization, if the operations
  were executed in two concurrent threads.
  On ABAP system side, one could find short dumps of type CALL_FUNCTION_ACCEPT_FAILED and in gateway trace 
  entries similar to
  *  LOCATION    SAP-Gateway on host appserverhost.corp / sapgw00
  *  ERROR       read from SAP gateway failed
  ...
  *  DETAIL      connection to gateway on host appserverhost.corp /
  *              sapdp00 broken
  
* Bugfix: Destination Configuration
  When omitting the CLIENT parameter in the destination, NCo used client 000 instead of using the expected 
  default behavior to login to the default client. Thus, it could even end up in a logon failure, in case
  the user needed to use different credentials in client 000 or the application does not work as expected due to 
  missing authorizations.

* Bugfix: bASXML serialization
  If a function module containing a parameter with a name starting with XML was executed, a shortdump occurred in ABAP 
  indicated by an RfcException with a text similar to "Internal error: Unexpected status in the ABAP runtime environment."
  The same is true if there is a structure or table parameter containing a field with such a name. This happened due to 
  a missing special escape sequence that should be used as the standard recommends to reserve this prefix for later
  standard extensions.

* Bugfix: Initialization
  The initialization of CPIC keepalive timeout might have failed when loading NCo

* Bugfix: Data container conversions GetChar()
  If a field in a data container with a character based type like CHAR or string  was filled with a single char, 
  GetChar() was not returning successfully as expected, but threw a RfcTypeConversionException exception. This 
  was happening due to an incorrect conversion implementation and happened in particular when invoking RFC_SET_REG_SERVER_PROPERTY
  against an NCo server.

* Bugfix: data container processing
  GetByte() incorrectly threw an RfcInvalidStateException instead of the correct RfcTypeConversionException,
  if a conversion to a byte was not possible.

* Bugfix: date conversions
  Conversion between ABAP DATS datatype and .NET Date type could fail with wrong results,
  if multiple threads were converting at the same time. This was caused by a missing
  synchronization which was leading to this race condition.

--------------------------------------------------------------------------------

Release Notes 3.0.24:
* Bugfix: NCo Server session management
  In case an exception occurred, the session has not been reported as destroyed,
  which should have been done as the connection is closed. When later trying to
  re-use the same thread. which potentially is still associated with that session,
  this could lead to confusion in the registered ISessionProvider

* Bugfix: initialization
  It could happen that communication did not work at all, as the low level socket
  layer was not properly initialized before communicating. Now NCo ensures that
  this socket layer is now always initialized very early.

* Bugfix: serialization
  An exception similar to SAP.Middleware.Connector.RfcInvalidParameterException: Element ABC of container metadata XYZ unknown
   at SAP.Middleware.Connector.RfcContainerMetadata`1.NameToIndex(String elementName) 
   at SAP.Middleware.Connector.RfcXRfcParser.ProcessBeginTag()
   at SAP.Middleware.Connector.RfcXRfcParser.parse()
  occurred if a function module returned a table or a nested structure in an exporting
  parameter, which was not defined in the NCo metadata. Now, such unknown parameters are
  simply ignored.  

* Bugfix: serialization
  An exception similar to SAP.Middleware.Connector.RfcInvalidStateException: index 30 out of range
  could occur in very rare cases when receiving data for a table or a nested structure
  in an exporting parameter.

* Bugfix: RfcRepository 
  Due to a wrong interpretation of the function module definition that was retrieved
  in the RfcRepository, a parameter of type BYTE was truncated at runtime. Actually, 
  only half of the data was stored in the parameter instance

* Bugfix: Tracing configuration
  An exception similar to  System.ArgumentNullException: Value cannot be null. Parameter name: args
    at String.Format(IFormatProvider provider, String format, Object[] args)
    at TextWriter.WriteLine(String format, Object[] arg)
    at RfcTrace.set_TracePerThread(Boolean perThread)
  occurred when adjusting the tracing policy. 

* Enhancement: Session management tracing
  Improved tracing of the invocations for the methods of the registered 
  ISessionProvider of RfcSessionManager.

* Enhancement: Log file
  Suppressing dev_nco_rfc.log when changing trace directory unless log has already
  been written to it

--------------------------------------------------------------------------------

Release Notes 3.0.23:
* Bugfix: Debugging ABAP code
  When trying to use the classic debugging which immediately enters the debugger
  and not the external debugging which pops up at a previously set break-point
  with an already existing debugger SAP GUI session, the the SAP GUI window
  starting for it is not popping up with a debugger, even though the
  configuration parameter ABAP_DEBUG is set 1.

* Bugfix: Attaching SAP GUI
  When configuring a destination with USE_SAPGUI set to 1 or 2, the SAP GUI could
  not be started if the target application server configured as ASHOST is reachable
  only via a NATting firewall. For attaching the SAP GUI session, the internal
  address that is not resolvable on the client was used in order to connect the
  SAP GUI to the application server. With 3.0.23 NCo ensures to always use the
  hostname that can be resolved on the client machine.

* Bugfix: Export parameter handling
  Even though an export parameter was set to not active, the implementation of the
  function module executed an if block that should not be executed as it is
  protected by the IS SUPPLIED predicate for that parameter. This happened, 
  because NCo only informed the ABAP system that this feature is supported, if 
  there was an IClientPassportHandler registered with the RfcPassportManager
  in the NCo runtime.

* Enhancement: re-entrance ticket support 
  With S/4HANA 1909 the technology used for re-entrance ticket support has changed.
  NCo 3.0.23 now supports this new approach.

* Enhancement: RfcConfiguration
  RfcConfiguration is now implementing the interface IDisposable, which allows
  to actively dispose the contained SecureString instances.

* Enhancement: NCo runtime
  A shutdown hook has been added that closes all open idle connections to prevent
  errors being written to the connected ABAP systems syslog, telling about
  connection failures, even though there is no real issue.

* Enhancement: Log
  The log is now showing full call stacks for exceptions, including cause exceptions

--------------------------------------------------------------------------------

Release Notes 3.0.22:
* Bugfix: session management
  Stateful calls to a NCo server could fail. One or more entries
  "System.ArgumentException: An item with the same key has already been added"
  could be found in the log. This happened, because the session Id of a 
  terminated or expired session was not removed from the list of session Ids, or
  more precisely the map associating session Ids with the respective session 
  information. In the rare case that a session Id reappeared later on for a
  different session, which is more likely in high load scenarios, said map threw
  an exception since the map does not allow overwriting existing entries. 
  In any event this was a case of memory leakage on account of retaining session
  information related to expired sessions.

* Bugfix: metadata handling
  Fields (or their metadata) were not available from the respective table (or its
  metadata) when creating table metadata manually and attempting to obtain fields
  by name. This was caused by creating Table metadata manually and modifying the
  line type (structure metadata) after creating the table metadata instance by
  adding further fields. An attempt was made to obtain such a field (or its metadata)
  from the table (or its metadata).

* Bugfix: server runtime
  "Concurrent Modification" exceptions could occur during server shutdown, if Server
  shutdowns were executed (very) frequently and running requests overlapped with the
  shutdown. NCo code was changed to fully synchronize the access to the list of
  server connections to prevent threads from iterating over the list of connections
  while others add connections to or remove connections from it.

* Bugfix: SapLogonIniConfiguration
  The data could not be read properly from SAPUILandscape XML, if XML comments were 
  contained in the XML document.

* Bugfix: Data processing
  When setting numbers to NCo data containers and the current culture is using the
  empty string as NumberGroupSeparator, en exception was thrown. NCo processing 
  was adjusted to deal with that setting properly.

* Enhancements: Serialized repository
  After loading a repository from a serialized JSON representation, consistency checks 
  have been added to ensure that metadata contained in the repository is consistent.

* Enhancement: initialization
  GeneralConfiguration.Initialize() has been added so that an application can ensure
  proper initialization of all layers in all situations. See API documentation for 
  details.

* Enhancement: default values
  ABAP_BOOL values are now supported as default values for parameters.

--------------------------------------------------------------------------------

Release Notes 3.0.21:
* Bugfix: session management
  Session management could throw an exception that leads to a log entry 
  "RfcSessionManager.UpdateSessions() threw KeyNotFoundException: The given key
  was not present in the dictionary". This happens, because adding new
  sessions to the internal session store was not properly synchronized
  and under high load race conditions could lead to situations, in which
  the object was not yet stored completely, but should be accessed again
  already.

* Bugfix: potential deadlock situations with infrastructure embedding
  NCo could be hanging in a deadlock situation in context of an ISessionProvider
  implementation. The ISessionProvider implementation locked an application-owned
  object in the IsAlive() method, before which NCo runtime has locked an object
  owned by NCo. In some other thread, the application locked the application-owned
  object as well and then locked the very same NCo object.
  NCo code was changed to use internal mutex objects only for all instances that
  can be used by applications and might be used for synchronization to prevent
  the possibility of deadlocks caused by improper synchronization sequences.

* Bugfix: tracing
  NCo Trace was not written, even though application configuration contained a
  default trace level larger than 0. The application code changed the log level
  to 0 via API, when starting. Also, a custom IDestinationConfiguration could
  set the TRACE property to 0 for destinations.
  In order to be able to generate traces needed during support, the default trace
  level set within the application configuration is now considered to be a minimum
  level. Thus, it can be ensured that trace can be generated even if the
  application is misbehaving or even does not allow to modify trace level at
  runtime again.

* Bugfix: SapLogonIniConfiguration
  When using SAPLogonIniConfiguration the destinations contained in SAPUILandscape
  XML are not found, because SAPUILandscape XML parser returns an empty list, if
  the XML file does not contain an XML preamble and contains comments. The
  SAPUILandscape parser accidentally interprets the comments section as SAP system
  information.
  Note: this is actually invalid XML format, but early versions of SAPGui 7.40 used
  to generate such XML files.
  With 3.0.21, the SAPUILandscape parser can now handle these badly formed files
  successfully, as long as the <Landscape> section is at the top of the document.

* Bugfix: High Availability Server with SAProuter
  The restart mechanism did not work properly, if downtime of the ABAP system
  was longer, the High Availability Server using the message server was in use,
  and a SAProuter was needed to connect to the partner. In the logs one could
  see failed reconnect attempts showing the SAProuter string prepended to the
  message server host multiple times. Now, it is ensured that the SAProuter#
  string is prepended only once.

* Enhancement: tracing 
  Mutexes used by NCo are now traced to allow an easier detection of deadlock
  situations.

* Enhancement: RfcRepository 
  The RfcRepository offers the possibility to check whether a function exists via  
  the method CheckFunctionExists. Find more details in the API documentation.

--------------------------------------------------------------------------------

Release Notes 3.0.20:
* Bugfix: communication runtime
  An IndexOutOfRangeException may occur, when receiving RFC data. RFC containers
  (e.g., compressed bASXML) may have length zero, i.e. they do not hold any data.
  As a result an empty byte array was passed as a buffer to the underlying read
  methods that eventually attempted to convert the empty byte array to a pointer
  to bytes through &buffer[0] which incurred the IndexOutOfRangeException. In
  order to avoid the misbehavior, Containers with length zero are ignored and do
  not reach the read methods anymore. Furthermore, should an empty array reach
  the read methods, the read methods treat an empty array the same as a null
  pointer (i.e. something that cannot hold any data), thus skipping any bytes read.

* Bugfix: communication runtime
  Potential buffer overwriting when reading RFC data (containers) could lead to 
  inexplicable crashes of processes involving NCo3. This is prevented by checking
  the buffer size and if necessary increasing it to hold at least the number of
  bytes to be read.

* Bugfix: RfcServer runtime
  Server connections involving group registration were not automatically reinstated
  unless all connections are lost (or a request is received), because the timer
  responsible for reinstating connections was not started unless all connections were
  lost. Now, a timer is started when all connections for a particular group member
  are lost.

* Bugfix: Connection monitor
  Calling RfcDestinationMonitor.GetConnectionsData() updated the last activity
  timestamp of the respective connections, which led to the effect that monitored
  connections were always considered used and hence never were cleaned up by idle
  timeout checker. 

* Bugfix: deadlock in tRFC, qRFC, bgRFC runtime
  Several threads were stuck in connection with RfcDestination.ConfirmTransactionID 
  (ConfirmUnitID, GetUnitState), typically manifested when attempting to call
  RfcDestination.GetClient in the context of RfcTransaction.Commit. Actually, a
  classic case of a deadlock caused by one thread locking a destination D and then
  trying to obtain the lock for a connection pool P while another thread already
  obtained the lock for P and then requires the lock for D.

* Bugfix: RfcDestination configuration 
  RfcCommunicationException telling "Connection parameter ASHOST or MSHOST missing"
  was thrown when connecting to an ABAP system, even though parameters are provided
  that represented a load balanced configuration over message server, but GROUP was
  not provided. However, the default PUBLIC was not used as desired and this was
  leading to the wrong RfcCommunicationException.

* Bugfix: SapLogonIniConfiguration
  saplogon.ini or SAPUILandscape.xml as not found, even though the environment variable
  SAPLOGON_INI_FILE or SAPLOGON_LSXML_FILE pointed to the correct location, whenever 
  the environment variable pointing to the file was referencing some other environment
  variable, e.g. %APPDATA% and this variable was not expanded before checking.

* Bugfix: Session management
  Server side session management was not implemented properly so that even though a
  server session had been finished, a following call did not fail.

* Enhancement: Stateful client applications
  Re-entrance scenarios are now supported by RfcSessionManager:
  RfcSessionManager.BeginContext() and RfcSessionManager.EndContext() now utilize a counter
  indicating how many BeginContext() calls still need to be closed by their respective
  EndContext() calls for each destination of any given session; this means that applications
  have to ensure that each BeginContext() has its matching EndContext(), otherwise connection
  leaks might occur.
  
* Enhancement: RfcServer functions
  The default function handler of a server can be an instance method.

* Enhancement: RfcInvalidSessionException 
  Introduced RfcInvalidSessionException that allows an ISessionProvider to tell to NCo that
  it tries to work on an invalid session in server scenarios.

* Enhancement: RfcTransaction, RfcBackgroundUnit
  Both classes provide some more information about current LUW content in new properties: 
  FunctionsCount and Functions. Find more details in the API documentation.

--------------------------------------------------------------------------------

Release Notes 3.0.19:
* Bugfix: SapLogonIniConfiguration
  If the file name given in the environment variable SAPLOGON_INI_FILE ends with
  whitespace characters, the creation of a SapLogonIniConfiguration object failed
  with an RfcInvalidStateException,  as those characters were not trimmed before
  attempting to open that file.

* Bugfix: RfcServer runtime
  When the gateway is restarted or shutdown, an NCo Server no longer fails to reconnect.
  The corresponding event for the state change from RUNNING to BROKEN was also not
  raised, because a newly introduced exception in a lower layer caused the flow of
  execution in an upper layer to jump past the point where the state change event
  is raised and the timer for the periodic reconnect attempts is started.

* Bugfix: RfcServer runtime
  When an NCo Server uses the feature of registering on an entire group of gateways
  and the first gateway in the group is down, the NCo Server aborted the startup and
  did not try to register on the remaining gateways, because a newly introduced
  exception caused the flow of execution to jump out of the loop over the gateway
  group instead of continuing with the next gateway in the group.

* Bugfix: RfcServer runtime
  When an NCo Server used "group registration" and did not provide the group, the
  registration failed with a network error, because the NCo server tried to use a
  wrong port number, when connecting to the message server.

* Bugfix: PasswordChangeHandler
  When an application changed the (initial) password of the backend user via
  PasswordChangeHandler, the new password was not updated in the destination
  parameters. This led to various follow-up problems, when the destination was used
  later on, as NCo still tried to use the old password, when it needed to open
  fresh connections to the backend.

* Bugfix: Destination Configuration
  MAX_POOL_WAIT_TIME setting could not be used, because it was not defined in the
  app.config scheme for destination configurations.

* Bugfix: NCo runtime
  Turning off delta management in destination configuration was not working, as
  the destination setting for delta management was ignored in NCo runtime.

* Bugfix: NCo runtime
  When processing many requests in ABAP, a deadlock situation could occur in NCo.
  The concrete deadlock situation happened only if there was very high load, a
  very short pool timeout setting, and the application was fetching the repository
  very often from an RfcCustomDestination.

* Bugfix: Destination Monitor
  Pooled connections were not listed in the result of RfcDestinationMonitor.GetConnectionsData(),
  even though they are visible in the RfcConnectionMonitor.

* Enhancement: SapLogonIniConfiguration
  When using the class SapLogonIniConfiguration, NCo now adds the System ID information
  to the returned RfcConfigParameters, if that information is present in the
  saplogon.ini or SAPUILandscape.xml file.

* Enhancement: SapLogonIniConfiguration
  In 3.0.17 and 3.0.18, NCo used to validate the file name of the saplogon.ini file,
  throwing an error, if the file had a different name. With 3.0.19 NCo now allows
  an arbitrary file name for the saplogon.ini file.

--------------------------------------------------------------------------------

Release Notes 3.0.18:
* Bugfix: codepage converters
  When calling function module in a backend system with a blended codepage such
  as 6100 and the function module contained a structure parameter with
  character-like fields (CHAR, NUMC, DATE, etc.), then the value of those fields
  was truncated to half its length, because the codepage converter has provided
  the an incorrect result length, and thus not the full byte result was
  transferred to the backend system.

* Bugfix: communication runtime
  With NCo 3.0.16 and 3.0.17, data compression and delta management was always
  turned off, if the backend system had ABAP release 7.02 or higher. This was
  caused by a bug in the handshake that determines the capabilities of the
  partner system. Thus, performance was decreased significantly in networks with
  high latency.

* Bugfix: Server authorization checks
  If an NCo server program uses the parameter SNC_PARTNER_NAMES, it could happen
  that a backend system was refused access to the server program, even though its
  SNC name was included in the SNC_PARTNER_NAMES value. NCo used to do a string
  comparison between the SNC name specified SNC_PARTNER_NAMES and the SNC name
  provided by the backend system.
  However, SNC names are not unique: they contain optional parts and may or may
  not have spaces in certain places. E.g. the following two SNC names refer to
  the same "identity", even though the strings do not match:
  "p/secude:CN=ABC, O=SAP-AG, C=DE" and  "p:CN=ABC,O=SAP-AG,C=DE".

* Bugfix: Destination Monitor
  When using CustomDestination instances, the RfcDestinationMonitor could contain
  duplicate entries, if different CustomDestination instances were created from
  the same parent.

* Bugfix: default values for decimal fields
  When providing default values for a parameter of data types like FLOAT, BCD, or
  DECF16 in a function module definition in ABAP, which is retrieved via an
  RfcRepository, the value was ignored, if the Culture used for the NCo program
  is not using a dot as decimal separator. NCo was using the Culture specific 
  conversion of string values for those numbers, but should have interpreted it
  Culture independently, which is the case now.

* Bugfix: IPv6 communication
  When using IPv6 and configuring a load balanced connection to a message server, 
  the list of servers for SNC was simply empty so that NCo fails to establish 
  a connection to that system. Find more details in SAP Note 2331363. 

* Enhancement: communication stability
  NCo now sends CPIC keep alive pings in regular time intervals to the SAP gateway
  during long running RFC client calls in order to prevent firewalls and other
  network devices from closing the used underlying TCP/IP socket after some low 
  level network connection idle timeout, although the respective RFC call is still 
  being executed and processed at the target AS ABAP back-end system. Additionally,
  this new CPIC keep alive ping feature also helps with promptly detecting network
  errors and the loss of the RFC communication partner, so that an appropriate 
  RfcCommunicationException can be thrown in such cases.

* Enhancement: Runtime behavior
  If an NCo client program calls a function module, and the function module
  attempts an RFC Callback (CALL FUNCTION ... DESTINATION 'BACK'), then NCo would
  formerly throw a  NotSupportedException, which would a) cause an error
  "Connection closed (no data received)" in the backend and b) potentially abort
  the client program, if the programmer did not expect such an exception. Now NCo
  returns a SYSTEM_FAILURE with detail text "Callbacks from ABAP are not supported"
  to the backend and throws an exception of type RfcAbapRuntimeException, which a
  client program needs to be prepared for anyway.

* Enhancement: SapLogonIniConfiguration
  When trying to use the saplogon.ini file for providing logon parameters via
  SapLogonIniConfiguration, NCo now additionally checks the registry keys
  \\HKLM[HKCU]\SOFTWARE\SAP\SAPLogon\Options\ConfigFileOnServer for the location of
  the saplogon.ini file. (This registry key has been introduced with SAPLogon 7.30
  in order to provide the ability to use one centrally maintained saplogon.ini file
  on a Windows Network Share instead of having to maintain potentially thousands of
  files on every end-user's frontend machine.)
  The locations, where NCo looks for the saplogon.ini file, are now as follows:
   1. File given in environment variable SAPLOGON_INI_FILE
   2. File SAP\Common\saplogon.ini in the current user's AppData directory
   3. The %WINDIR% directory (usually C:\WINDOWS)
   4. File given in registry key SAP\SAPLogon\Options\ConfigFileOnServer, where NCo
      checks both HKEY_CURRENT_USER and HK_LOCAL_MACHINE, and both \SOFTWARE and
      \SOFTWARE\Wow6432Node

* Enhancement: Server API
  If an NCo program loads the DLLs sapnco.dll/sapnco_utils.dll not from the standard
  DLL search path, but for example via the Shadow Copy Feature (e.g. if NCo is used
  in an Excel plugin), and this NCo program needs to process function modules that
  have parameters of type DecFloat (ABAP types decfloat16/decfloat34 or DDIC types
  DF16_RAW/DF34_RAW/DF16_DEC/DF34_DEC), then the program could abort with the error
  message "decfloat shared library could not be loaded". In order to avoid this, the
  installation directory of NCo had to be added explicitly to the PATH. Now NCo will
  always try to load the library libicudecnumber.dll from its own installation
  directory.
  Note: this is achieved via the Win32 Kernel API SetDllDirectory(). If this causes
  unwanted side-effects in your program, so that maybe other required DLLs can no
  longer be found, you can turn off this feature using the general configuration
  parameter LoadDecFloatLibFromInstallDir=false.

* Enhancement; Exception handling
  The exceptions of NCo are now offering an ErrorCode property, in which some more
  detailed information about the cause for the exception is encoded. This allows
  programmatic interpretation of this concrete exception without parsing the message
  text, which is in particular useful, when error info of low level components is
  forwarded by the NCo layer. See API documentation for details about available the
  codes.

* Enhancement: General configuration
  With the property GeneralConfiguration.SocketBufferSize, it's possible to configure
  the socket buffer size for all sockets used by NCo. See API documentation for
  details. In addition, the GeneralSettings section in app.config has been extended
  to support socketBufferSize.

* Enhancement: platforms
  Windows 10 is a supported platform for the .NET 40 runtime variants.

--------------------------------------------------------------------------------

Release Notes 3.0.17:
* Bugfix: codepage converters
  When trying to communicate with an RfcServer using a blended codepage such as 6200, the
  RfcServer was refusing the connection with an exception telling that a communication from
  a "Non-ABAP RFC client not supported". The partner type is now also recognized correctly
  when using such a setup.

* Bugfix: CustomDestination
  Setting an SAP assertion or SAP logon ticket using the SAPSSO2Ticket property did not
  work properly. Hence, after a while, when the first ticket set in the RfcCustomDestination
  was expired, it was no longer possible to get a connection established for the user
  associated with the ticket. The behavior has been changed to always use the last update
  for the property for that user.

* Bugfix: CustomRepository
  When trying to use a CustomDestination as repository destination in a CustomRepository,
  the parent destination was used. However, for CustomRepository instances it should
  be allowed to also use a CustomDestination for the metadata lookup.

* Bugfix: Connection Monitor
  Pooled connections were wrongly listed as STATEFUL in the monitor instead of POOLED.

* Bugfix: RfcServer runtime
  Some potential deadlocks in the RfcServer processing have been removed.

* Bugfix: RfcServer runtime
  In the RfcSystemAttributes passed to the function implementation method it could happen
  that some of the attributes such as User were not properly filled.

* Enhancement: Support for SAPUILandscape.xml
  Applications that want to reuse logon parameters maintained in a SAPUILandscape.xml
  file on the current host can do so now. The class SapLogonIniConfiguration
  encapsulates whether saplogon.ini or SAPUILandscape.xml needs to be used.

* Enhancement: Destination API
  Class RfcDestination now offers a method IsUsingDefaultTraceLevel() to check
  whether the destination configuration is using the global trace level. See API
  documentation for details.

* Enhancement: Server API
  Class RfcServer now offers a method IsUsingDefaultTraceLevel() to check
  whether the server configuration is using the global trace level. See API
  documentation for details.

--------------------------------------------------------------------------------

Release Notes 3.0.16:
* Bugfix: High Availability Server with SNC
  When trying to use SNC with the registered server in high availability mode,
  starting the server failed with the message that partner cannot be reached,
  because the connection is refused. This was caused by the fact that wrongly
  always port 48 was used to register the server instead of the correct gateway
  port. Now, the correct port is used for registration and the setup works as
  expected.

* Bugfix: Repository
  When a function module in an ABAP system of version 7.02 is flagged to support
  bASXML, NCo was not using this flag in an associated RfcRepository that fetches
  the RfcFunctionMetadata from that system.

* Bugfix: protocol serialization
  When a function module is flagged to support bASXML, the runtime is now adhering
  the flag when communicating with ABAP systems of version 7.02, and thus improving
  performance when exchanging large data in parameters belonging to an import,
  export, or changing parameter list.

* Bugfix: protocol deserialization
  In case a parameter of type CHAR was containing \t, \n or other whitespace at the
  end of its value, it was cut off, when being received from ABAP, which was wrong.
  Only ' ' should be trimmed at the end of a CHAR field - in all places.

* Bugfix: connection state handling
  When sending data to an ABAP system it could happen sometimes that the connection
  was interrupted if the network was not fast enough. This could happen, if some
  data was received before over the same connection

* Bugfix: Regression in PasswordChangeHandler
  When trying to change a password in a PasswordChangeHandler an exception was
  thrown telling that the connection is busy and thus the password change was
  not executed.

* Bugfix: Crash in RfcServer
  A native crash could have occurred when receiving an RFC request from ABAP to NCo
  that was secured with SNC (Secure Network Communication). Please see SAP note 2156181
  (https://service.sap.com/sap/support/notes/2156181) for further details.

* Enhancement: General configuration
  With the property GeneralConfiguration.ClientConnectTimeout it's possible
  to configure the timeout when connecting to an ABAP system via a destination.
  See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support clientConnectTimeout.

* Enhancement: General configuration
  With the property GeneralConfiguration.CPICKeepAliveResponse it's possible
  to configure whether a response should be requested for RfcServer connection
  keep alive messages.
  See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support cpicKeepAliveResponse.

* Enhancement: General configuration
  With the property GeneralConfiguration.CPICKeepAlivePingTimeout it's possible
  to configure the timeout for RfcServer connection keep alive messages.
  See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support cpicKeepAlivePingTimeout.

--------------------------------------------------------------------------------

Release Notes 3.0.15:
* Bugfix: Trace files
  When tracing large scenarios, the created trace files are supposed to be limited
  in size and a new file should be created when reaching the limit. Though this worked
  fine, the previous trace file was not kept as a backup so that a trace could be
  incomplete and thus an analysis potentially impossible. Now, old trace files are
  kept with a suffix ".old#"

* Enhancement: General configuration
  With the property GeneralConfiguration.AnyDateTimeValueAllowed it's possible to
  configure that there is no validity check for DATE and TIME fields. This is
  sometimes required if ABAP functions return such invalid values.
  See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support anyDateTimeValueAllowed.

* Enhancement: Multiple stateless connections
  It is now possible to have multiple threads belonging to a single session that
  can invoke function modules concurrently on the same RfcDestination as long as
  there hasn't been a context started for this destination in the surrounding session
  with RfcSessionManager.BeginContext(destination), i.e. all invoked function module
  calls are stateless.

--------------------------------------------------------------------------------

Release Notes 3.0.14:
* Bugfix: Trace configuration
  When the default trace level was changed at runtime (by setting the property
  RfcTrace.DefaultTraceLevel), the trace level for destinations was not adjusted
  that inherited the default trace level due to the fact that they didn't set
  a trace level in their own configurations.

* Bugfix: stateful server behavior
  When setting a server connection to stateful, the server should add an additional
  stateless connection in order to prevent denial of service attacks. When finishing
  stateful, the number of (stateless) connections shall be reduced again to the
  number of configured connections. However, this was not working correctly.

* Bugfix: IPv6 behavior
  In case NCo was running with IPv6 support being turned on and if the own machine
  had an IPv6 address representation that is shorter than 8, an ArgumentOutOfRangeException
  was thrown on a SubString invocation within the method RfcConnection.WriteRfcSessionInfo().

* Bugfix: Server function module processing
  Due to race condition in RfcServer initialization, the following could happen:
  if two threads processed the same still unknown function module name, it could happen,
  that despite the synchronization both try to insert the same key into the dictionary
  of known function module processors, leading to a System.ArgumentException with the
  message "An item with the same key has already been added."

* Bugfix: Custom destination
  When custom destinations were used heavily in multithreaded use cases and in that
  environment also destinations were often set to stateful by using RfcSessionManager.BeginContext()
  and set back to stateless with RfcSessionManager.EndContext(), an System.InvalidOperationException
  with the message "Collection was modified; enumeration operation may not execute." could
  be thrown.

* Bugfix: initialization
  On newer Microsoft Windows versions (Win7, Win8) it may happen, that the DllMain() function
  of sapnco_utils.dll hangs while the operating system is loading the library. This can occur,
  if Microsoft Forefront/TMG is active on that machine. An initialization function of the
  internally linked CPIC library used to call WinSock32 functions. And the sapnco_utils.dll
  in turn called this CPIC initialization function from inside DllMain(), but calling these
  functions within DllMain() is not desired by Microsoft. In order to avoid this, the initialization
  routines have been adjusted.

* Bugfix: bgRFC client
  When using bgRFC client functionality with units of type QUEUE, the queues are simply ignored
  in the ABAP system, due to the fact that a wrong Unit Type ID was used in the internal runtime
  for such bgRFC Units.

* Bugfix: data type conversions
  When using GetDecimals on fields that contain a value that should be convertible to decimal, but
  is only representable in scientific notation with exponent, a a System.FormatException is thrown by NCo
  due to the fact the Convert.ToDecimal() is used, which dies not support this notation.

* Improvement: destination configuration exceptions
  When using a configuration without ASHOST, but with SYSNR, a message is raised telling
  that GATEWAY_HOST is missing.  When inserting this parameter in app.config, there is
  an error in the app.config schema, as GATEWAY_HOST is not really a configuration parameter.
  Now, there are more early checks and in case of a configuration issue,
  a descriptive RfcConfigurationException is informing in detail about the
  configuration issue.

* Enhancement: High Availability Server
  NCo is now offering the possibility to register a server with a configuration that
  allows to register a server on multiple gateways of an ABAP system automatically.
  By using the fitting logon group on both sides or all servers, and configuring the
  destination in the ABAP system accordingly, a specific application server (gateway)
  will no longer be a single point of failure.
  Find more information in the API documentation and the programming guide.

* Enhancement: Session Management
  Class RfcSessionManager now offers a static method IsStateful to check
  whether a destination is used statefully within the current session context.
  See API documentation for details.

* Enhancement: Destination Configuration
  A parameter to turn off usage of bASXML has been introduced.
  See API documentation of RfcConfigParameters.NoBasXml for details.

* Enhancement: Support for SNC_LIB_2
  Limited support for more than one concurrent SNC library. Please see note 2025528
  (https://service.sap.com/sap/support/notes/2025528) for details.

--------------------------------------------------------------------------------

Release Notes 3.0.13
* Bugfix: element type compatibility
  An RfcTypeConversionException was thrown when setting a structure as a field, parameter,
  or attribute value even though the respective data types are the same. This issue happened
  after clearing or loading metadata and when retaining a structure from the time before
  loading or clearing and setting it on a container created after clearing or loading.

* Bugfix: saplogon.ini parameters
  When using saplogon.ini as source of logon parameters, entries of the form [Origin]=MS_SEL_SERVER
  did not work correctly, resulting in the error message "group name too large".

* Bugfix: loss of trailing white space
  Trailing white space characters other than SPACE (0x20) disappeared from values of CHAR fields.

* Bugfix: SNC connectivity
  When a backend was configured to allow SNC connections only via the 48XX ports, NCo failed to
  establish the connection.

* Bugfix: Metadata lookup in connection with custom destinations
  When using custom destinations without one or more designated repository destinations and changing
  backend users/passwords, metadata lookup may have failed.

* Bugfix: Destination configuration
  The default IDestinationConfiguration implementation, which is using app.config did not support
  the following configuration parameters for destinations: REPOSITORY_USER, REPOSITORY_PASSWD,
  USE_SYMBOLIC_NAMES, and ALIAS_USER

* Enhancement: RfcServerContextInfo
  RfcServerContextInfo was enhanced to expose the RfcServer instance which is processing the incoming
  request as property Server.

* Enhancement: General configuration
  With the property GeneralConfiguration.DisableWily it's possible to disable
  Wily for the NCo application. See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support disableWily.

* Enhancement: General configuration
  With the property GeneralConfiguration.CPICMaxConnections it's possible to
  configure the maximum number of CPIC connections for the NCo application.
  See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support cpicMaxConnections.

* Enhancement: General configuration
  With the property GeneralConfiguration.CPICKeepAlivePingInterval it's possible
  to configure the interval for RfcServer connection keep alive messages.
  See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support cpicKeepAlivePingInterval.

* Enhancement: Destination Management
  Class RfcDestinationManager now offers a static method IsDestinationConfigurationRegistered to check
  whether a destination configuration (other than the default configuration read from app.config) was
  registered. See API documentation for details.

* Enhancement: Server Management
  Class RfcServerManager now offers a static method IsServerConfigurationRegistered to check
  whether a server configuration (other than the default configuration read from app.config) was
  registered. See API documentation for details.

--------------------------------------------------------------------------------

Release Notes 3.0.12
* Bugfix: tracing
  Setting trace level 2 or higher (or trace level PublicAPI) in connection
  with tRFC incurred a NullReferenceException.

* Bugfix: time and date values
  Time/date conversion errors caused by the Japanese calendar have been fixed
  by (explicitly) using the invariant culture (and hence the Gregorian calendar)
  at all times.

* Bugfix: runtime
  It could happen that even function invocations have been canceled running
  within sessions that are still alive.

* Bugfix: Memory consumption
  In applications that used many short-lived threads, a memory leak occurred due to
  the fact that thread local storage memory in unmanaged code was not freed when the thread
  was released.

* Improvement: function serialization performance
  Performance issues notable when transmitting large amounts of structured
  data in exporting, importing or changing parameters that contain single fields with a
  major part of this data amount.

* Improvement: initial field values
  Validity checks for strings representing initial date/time are now
  less stringent to take into account ABAP's lax treatment of such values

* Enhancement: data type conversions
  Fields, parameters, or attributes with ABAP data type STRING or CHAR
  now have setters and getters for integer types (Byte, Int16, Int32, and Int64).
  Consult the API documentation for details.

--------------------------------------------------------------------------------

Release Notes 3.0.11
* Bugfix: Logon Language
  The conversion routine that converts ISO into SAP language wrongly relied
  on upper-case language codes, but was given, and tried to work with, lower-case codes.

* Bugfix: Delta Manager
  An RFC client request failed with an "RfcAbapRuntimeException: Invalid Delta Manager
  object ID (2 <=> 1)". On ABAP side a shortdump CALL_FUNCTION_OBJECT_ID with the same
  error message is recorded in ST22. Reason for this was that the NCo client was
  trying to execute a stateful sequence of RFMs, some of which reused the same internal
  table. The stateful connection broke down - e.g. because of a network error - but the
  client tried to continue the sequence. NCo took a fresh (stateless) connection for the
  following requests, but reused the delta manager object IDs from the stateful connection.
  This led to an object ID mismatch in the ABAP backend system.

* Bugfix: sapogon.ini integration
  SapLogonIniConfiguration accidentally interprets the saplogon.ini entry
  as being of type "message server logon". This leads to a mismatch of the required
  logon parameters.

* Bugfix: configuration
  The configuration property REPOSITORY_USER was not working as desired, the
  value had been simply ignored even for repository connections.

* Bugfix: CPIC connection management
  Hanging server connections caused by a bug in the CPIC layer has been fixed
  as described in note 1791529. The relevant patch level is included in NCo 3.0.11.

* Improvement: Performance tracing
  Introduction of flag for performance tracing as additional possibility
  for simple trace analysis.

* Improvement: Monitoring
  Enhancements of destination monitoring. See API documentation
  of RfcDestinationMonitor for details.

* Improvement: Monitoring
  Introducing repository monitoring. See API documentation of
  RfcRepositoryMonitor for details.

* Improvement: Configuration
  A designated timeout for idling repository connections was introduced.
  See API documentation of RfcConfigParameters.RepositoryConnectionIdleTimeout for details.

* Improvement: Configuration
  Loading the default configuration has now a built-in recovery mechanism
  in case a ConfigurationErrorsException occurs while loading. See API documentation of
  RfcConfigParameters for details.

* Enhancement: Security
  It is now possible to pass passwords as SecureString to a destination. For
  that an implementation of IDestinationConfiguration can set the password into the
  returned RfcConfigParameters instance. See API documentation of
  RfcConfigParameters.SecurePassword for details.

--------------------------------------------------------------------------------

Release Notes 3.0.10
* Bugfix: binary incompatibility in public API
  After applying NCo 3.0.9, a System.MissingMethodException with the text
  "Method not found: 'System.String SAP.Middleware.Connector.RfcDestination.get_Name()'"
  was thrown when trying to use an existing NCo application with it. However,
  when compiling the application again, everything works fine. This was caused by some
  source code compatible change that was not binary compatible: The public read-only
  property Name was changed to be a public read-only field. In order to fix the issue,
  the source code compatible change was adjusted so that it is now binary compatible
  again.

--------------------------------------------------------------------------------

Release Notes 3.0.9
* Bugfix: Replacing expired SSO2 tickets
  Expired SAP SSO2 tickets could not be replaced with valid tickets without
  rendering the affected destinations invalid, and hence losing the entire connection
  pool as well as open connections, because there was no explicit mechanism for
  "on the fly" replacement of expired tickets and implicit mechanisms like used
  in JCo were simply not possible due to the .NET implementation of Dictionary.
  With patch level 3.0.9, a mechanism for replacing expired SSO2 tickets was added
  that leaves destinations and their connections intact. See API documentation of
  RfcConfigParameters.UpdateSSO2Ticket and IDestinationConfiguration.GetParameters
  for details.

* Bugfix: Interchangeable metadata
  Data containers (tables, structures, or ABAP objects) had been rejected if they
  were taken from a repository that is different from the repository of the target
  container, even though the metadata has been identical (but from different
  repositories). NCo3 employed instance equality to check for compatibility of
  data containers, which implied that identical metadata (taken from the same
  repository) has been required to pass the compatibility check.
  The compatibility check of data containers is now less restrictive and also
  admits data containers with equivalent metadata that do not necessarily have
  to originate in the same repository.

* Improvement: destination configuration exceptions
  When not specifying required configuration parameters, e.g. the SYSID, when
  trying to connect via load balancing, a very low level exception had been thrown,
  in which it was not immediately clear, why the connection could not be
  established. Now, there are early checks and in case of a configuration issue,
  a descriptive RfcConfigurationException is informing in detail about the
  configuration issue.

--------------------------------------------------------------------------------

Release Notes 3.0.8
* Bugfix: destination configuration
  Changing the trace level of a destination by modifying the configuration of
  the destination had no effect on property TraceLevel for that destination,
  even when a configuration update event was fired.

* Bugfix: destination configuration
  Using the connection parameter CharacterFaultIndicatorToken incurred an
  RfcInvalidParameterException, as the 4-digit string value was attempted to be
  parsed as a 1-byte integer.

* Bugfix: repository persistence
  Deserialized table metadata (using RfcRepository.Load) and all containers
  using it might exhibit inconsistent behavior; e.g., (table) parameter values
  might be empty where a non-empty table was expected, because the table
  metadata obtained through RfcRepository.Load was not properly set up.

* Bugfix: server runtime
  In the server case, received parameters might not be deserialized (e.g., the
  TID transmitted in the context of ARFC_DEST_CONFIRM was an empty string). This
  issue was hard to reproduce since it was happening rarely and randomly.
  Typically, the issue was most likely to occur if there was only one server
  connection (i.e., REG_COUNT=1).

* Bugfix: destination management runtime
  Destinations were replaced (shown as REPLACED in trace files) even though the
  destination configuration did not change. However, critical parameters that
  warrant a destination replacement were provided by the configuration in a
  non-normalized manner; for instance, SYSNR="5" (instead of SYSNR="05").
  Those were considered modified, as the destination always holds normalized
  values, whereas the configuration may provide values that were not normalized
  and hence different.

* Bugfix: SAProuter string handling
  When trying to establish a connection to an ABAP system, which is configured
  to use load balancing, the connection shall be established via a SAProuter, and
  the SAProuter string has a trailing /H/, establishing the connection failed.

* Enhancement: Support for saplogon.ini
  Applications that want to reuse logon parameters maintained in a saplogon.ini
  file on the current host can do so now. For a complete documentation of the
  new feature see the API documentation of class
  SAP.Middleware.Connector.SapLogonIniConfiguration.

* Enhancement: new property on IRFCParameter
  Introduction of property IRfcParameter.DefaultValue. See API documentation
  for details.

* Enhancement: logging
  The dev_nco_rfc.log file entries were enhanced to contain the process ID so
  that it's easier to correlate them with the corresponding trace files.

* Enhancement: logon procedure
  Improved logon procedure for languages available in Unicode SAP systems only.
  Some languages like Armenian, Georgian, Vietnamese, Macedonian and many
  others are available in Unicode SAP systems only. If logging on with such a
  language to an SAP ABAP backend system, it was mandatory to specify an
  additional destination configuration parameter like RfcConfigParameters.Codepage
  (CODEPAGE) which was indicating a Unicode communication type, otherwise such
  logons failed with an RfcLogonException showing the error message "Select
  one of the installed languages" although the appropriate language was installed.
  This logon  procedure has been improved so that it does not require any
  additional communication code page destination property anymore in this case.
  The Unicode communication type is now automatically detected and used for
  logging on with such new SAP system language keys. Please see note 895560
  (https://service.sap.com/sap/support/notes/895560) for details on languages
  that are only available in Unicode SAP systems.

* Enhancement: DNS caching configuration
  With the new properties GeneralConfiguration.DNSCacheTTL and
  GeneralConfiguration.DNSNegativeCacheTTL it is possible to configure the
  behavior of the DNS caches in NI. See API documentation for details.
  In addition, the GeneralSettings section in app.config has been extended
  to support dnsCacheTTL and dnsNegativeCacheTTL.

* Enhancement: CPIC tracing
  Instead of having to set the environment variable CPIC_TRACE for turning on
  CPIC trace, NCo now offers GeneralConfiguration.CPICTraceLevel. Thus, it is
  possible to adjust the CPIC trace level at runtime without having to restart
  the executable. See API documentation for details. In addition, the
  GeneralSettings section in app.config has been extended to support
  cpicTraceLevel.

--------------------------------------------------------------------------------

Release Notes 3.0.7
* Bugfix: monitoring
  RfcDestinationMonitor.GetConnectionsData() always returned an empty list. Now,
  all RfcConnectionData belonging to the destination are returned in a list.

* Bugfix: repository - dynamic metadata lookup
  When using RFC_METADATA_GET for roundtrip optimization, the metadata might be
  faulty (e.g., character fields had the wrong length). This happened
  exclusively in connection with parameter metadata in the case when the type of
  the parameter was a predefined type (defined through a predefined field of a
  structure).

* Bugfix: connection management
  Peak connection limit was exceeded although the number of active connections
  did not exceed that limit. This happened after communication failures
  (RfcCommunicationException), because those connections were not removed from
  the list of active connections. Eventually, that list is clogged up with
  invalid connections.

* Bugfix: communication runtime
  When not configuring the language in a destination, English was used instead
  of the default language as configured for the corresponding user in the
  backend. In case there is no language provided through the configuration,
  the NCo runtime internally added English as configured value for the language,
  which was not correct.

* Bugfix: communication runtime
  An ArgumentOutOfRangeException with the message "Length cannot be less than zero"
  was thrown when invoking a function module a function module that is implemented
  on top of VM container, i.e. a function module implemented in Java,
  e.g. CFG_API_CREATE_CONFIG. The call stack of the exception was similar to the one
  below
    Parameter name: length
    at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
    at SAP.Middleware.Connector.RfcConnection.ReadRfcCDestination(Int32 length)
    at SAP.Middleware.Connector.RfcConnection.ReadUpTo(RFCGET readState, RfcFunction function, RFCID toRid)
    at SAP.Middleware.Connector.RfcConnection.RfcReceive(RfcFunction function)
    at SAP.Middleware.Connector.RfcFunction.RfcDeserialize(RfcConnection conn, IRfcIOStream stream)
    at SAP.Middleware.Connector.RfcFunction.RfcCallReceive(RfcConnection conn, IRfcIOStream stream, RFCID rid)
    at SAP.Middleware.Connector.RfcFunction.RfcCallReceive(RfcConnection conn)
    at SAP.Middleware.Connector.RfcFunction.Invoke(RfcDestination destination)
  Now, NCo was made aware of the slightly different behavior of the VMC runtime
  that caused this failure.

* Improvement: Monitoring
  Assigning a value of 0 to environment variable Cor_Enable_Profiling did not
  disable Wily (and therefore did not prevent the creation of a possibly unwanted
  client passport handler), because only 0x0 was accepted as valid value.
  Now, various representations of the value 0 are recognized.

* Bugfix: date serialization
  Initial dates transmitted via xRfc as four spaces, a hyphen, two spaces,
  a hyphen, and two spaces, incurred a conversion error.

* Bugfix: multithreading with RfcDestinationManager
  One or more NullReferenceException exceptions with message
  "Object reference not set to an instance of an object" were thrown when
  calling RfcDestinationManager.GetDestination or RfcRepostory.CreateFunction
  concurrently from multiple threads. RfcDestinationManager.GetDestination
  was changed to be implemented fully thread-safe.

* Bugfix: server runtime
  Server restart was not working as expected. A server remained disconnected,
  even if a registration with the gateway should work. The restart check has
  been improved so that server restart is working as expected.

* Enhancement: configuration enhancement
  The use of roundtrip optimization can be configured in the GeneralSettings
  section via attribute useRoundtripOptimization. Values "on" or "true" switch
  on roundtrip optimization for all repositories, whereas "off" or "false"
  switch it off. (These string values are case-insensitive). In the absence
  of the attribute (or the entire section), or if any other value is supplied,
  the backward compatible default behavior is applied. See API documentation
  of RfcRepository.UseRoundtripOptimization for details.

* Enhancement: security configuration enhancement
  The new configuration parameter SNC_SSO for destinations allows turning off
  the SSO behavior of SNC setups. More details are available in note 1701870:
  https://service.sap.com/sap/support/notes/1701870.

--------------------------------------------------------------------------------

Release Notes 3.0.6
* Improvement: SystemAttributes
  If the backend is down while someone tried to retrieve the SystemAttributes
  from the corresponding destination for the first time, the attributes remained
  empty forever, leading to System.ArgumentNullExceptions when trying to access
  them. Now, NCo updates fields containing null on later access.

* Bugfixes: Multithreading and NullReferenceExceptions
  In a multi-threaded scenario a NullReferenceException might erratically occur
  when starting parallel sessions through RfcSessionManager.BeginContext (and
  using the default session provider) or in RfcDestinationManager.GetDestination().
  To avoid those race conditions, some internal methods have been synchronized.

* Enhancement: initial values for fields
  When trying to set a byte array containing only 0 bytes to a DATE or TIME field,
  a RfcTypeConversionException occurred, as this value was considered invalid.
  Now, 0 bytes are no longer considered an invalid date or time. Instead they are
  considered to signify 'initial' which translates to "00000000" or "000000",
  respectively.

* Bugfix: configuration update for RfcConfigParameters.SAPSSO2Ticket
  Existing destinations were not affected by modification of configuration parameter
  RfcConfigParameters.SAPSSO2Ticket, regardless of whether the registered destination
  configuration fires a change event or not. This was due to a bug in the handling
  of this parameter: RfcConfigParameters.SAPSSO2Ticket was not treated as a
  parameter that should trigger a replacement of destinations (i.e., invalidating
  existing destinations and creating new ones in their place).
  As a matter of fact, no action was taken whenever that parameter changed.

* Bugfix: SAPGUI with RFC
  When making RFC with SAPGUI dialog by using a destination with USE_SAPGUI=1 (or 2),
  the RFC call failed with an RfcAbapRuntimeException "Starting of SAPGUI failed".
  In SAPGUI, an error message like "partner '192.168.13.75:3200' not reached.
  WSAEWOULDBLOCK:  resource temporarily unavailable" was also shown.
  If there exists a NAT-like firewall between the frontend and the SAP backend
  system, the SAP application server may have an internal IP-address for accessing
  the server behind the firewall and an external IP-address for accessing the
  server from outside. When trying to start the SAPGUI session during setting up an
  RFC connection with SAPGUI dialog, NCo 3.0 mistakenly passed the internal
  IP-address, instead of the external IP-address, to the SAPGUI and this caused the
  SAPGUI to fail to reach the application server. NCo now ensures to pass the
  external address, under which it knows the partner system, to the SAP GUI startup
  call so that the SAP GUI succeeds to establish the connection.

* Bugfix: CPIC layer fix
  In certain situations, very often in conjunction with the use of VPN, one or more
  of the following exceptions are thrown:
    a) System.FormatException with different messages.
    b) SAP.Middleware.Connector.RfcCommunicationException with a message like this:
       LOCATION    CPIC (TCP/IP) on local host with Unicode
       ERROR       client with wrong appc header version rejected
       TIME        Wed Dec 07 23:15:31 2011
       RELEASE     720
       COMPONENT   CPIC (TCP/IP) with Unicode
       VERSION     3
       RC          246
       MODULE      r3cpic.c
       LINE        8554
       DETAIL      client version 6, gateway version 120 (165.130.193.210/3385)
       COUNTER     2
  The bug causing this in the underlying CPIC library has been fixed. Find more
  details in note 1664732: https://service.sap.com/sap/support/notes/1664732.

* Bugfix: destination management
  Getting a destination via RfcDestinationManager.GetDestination using
  RfcConfigParameters a second time with modified parameters (but with the same
  name) returned the destination with the original outdated parameters. Now, the
  correct set of parameters is returned.

* Bugfix: destination configuration RfcConfigParameters.MaxPoolWaitTime (MAX_POOL_WAIT_TIME)
  Setting the parameter MAX_POOL_WAIT_TIME (or RfcConfigParameters.MaxPoolWaitTime)
  had no effect. The value of MaxPoolWaitTime is now taken into account.
  *Note* that after the fix MaxPoolWaitTime is measured in milliseconds, which
  is also reflected by the API documentation.

* Bugfix: connection monitoring
  When using RfcConnectionMonitor.GetConnectionsData no idle connections (retained
  for possible later use) were returned.
  Now, besides active (stateless) connections and stateful connections, also "pooled"
  connections (i.e., connections that are idle but retained for later use) are
  returned. Note that property State as well as the associated int constants
  of class RfcConnectionData have been deprecated. We recommend to replace State
  with property CurrentState (which makes use of an enumeration) and discontinue
  the use of the int constants as soon as possible.

* Bugfix: CPIC tracing
  The CPIC trace file generated by NCo 3.0 processes didn't contain CPIC function
  calls nor the CPIC payload regardless of CPIC trace level, because the CPIC
  tracing functionality of CPIC library was suppressed for client connections.

* Enhancement: repository persistence
  Repositories (metadata caches) can be saved to and loaded from a resource of your
  choice. That way, startup time of an application can be reduced significantly
  if expensive metadata lookup is involved. However, keeping the saved
  repositories up-to-date is the application's responsibility.

* Enhancement: destination management
  RfcDestinationManager.GetDestination(string) could solely be used if an
  IDestinationConfiguration was present. Now this method can also be used to
  retrieve a destination created with RfcConfigParameters, effectively getting
  the destination by its name without the necessity to set up RfcConfigParameters
  containing the name only.

* Enhancement: WMI provider
  In the .NET 4.0 variant, NCo 3.0 now offers a WMI data provider that can be
  used for monitoring and analysis purposes. Details can be found in the
  documentation.

--------------------------------------------------------------------------------

Release Notes 3.0.5
* Bugfix: Crash introduced with 3.0.4
  The .NET application using NCo simply terminated with the following exception:
  System.InvalidOperationException was unhandled
  Message: Queue empty.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Collections.Generic.Queue`1.Peek()
   at SAP.Middleware.Connector.RfcConnectionPool.RemoveTimedoutConnections(DateTime now)
   at SAP.Middleware.Connector.RfcConnectionPool.CheckConnectionTimeout(Object state)
   at System.Threading._TimerCallback.TimerCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
                                          ContextCallback callback, Object state)
   at System.Threading._TimerCallback.PerformTimerCallback(Object state)
  This happened in the timeout checker, when the pool was getting empty.
  Unfortunately, the timeout checker routine did not catch all exceptions so
  that the Thread running that timer crashed and with it the whole .NET
  application. The timeout checker was adjusted to check the pool state without
  causing exceptions, and in addition it catches all exceptions that might occur
  due to error situations to avoid further undesired terminations of the NCo
  application.

--------------------------------------------------------------------------------
Release Notes 3.0.4
* Bugfix: configuration with app.config
  When specifying a GenerelSettings section in the app.config file, but
  not the parameter traceDir in it, the application aborted with the
  following error message:
  Could not initialize configuration: System.ArgumentNullException: String
  reference not set to an instance of a String.
    Parameter name: source
       at System.Globalization.CompareInfo.IsSuffix(String source, String suffix,
                                                    CompareOptions options)
       at System.String.EndsWith(String value, StringComparison comparisonType)
       at System.String.EndsWith(String value)
       at SAP.Middleware.Connector.RfcTrace.Initialize(String directory,
                                           Boolean perThread, String encoding)
  The configuration parser was enhanced to accept such a valid configuration.

* Bugfix: server runtime
  An attempt to obtain the function list from a server (e.g. by using
  Extras/Function List for a destination in SM59) incurred a
  RfcInvalidParameterException as the implementation of RFC_DOCU to gain
  access to a non-existent parameter "RFCDOCU" instead of "DOCU".

* Bugfix: serialization and compression
  When sending documents to an NCo Server, an exception like
  "RfcSerializationException: End mark of RFCID.NotUsed (0x0000) not found."
  occurred. The documents were sent concurrently via tRFC and produced a heavy
  load in a server running several threads. The documents required compression
  due to their size. When exchanging data between managed and unmanaged code
  sections data could get lost if the garbage collector re-arranged memory
  due to heap fragmentation. Thus, the decompressed tRFC datastream started
  with many 0 bytes, which eventually resulted in the RfcSerializationException.
  Now, the code which is exchanging the data between managed and unmanaged code
  sections was adjusted to react correctly in case the garbage collector
  re-arranged memory due to heap fragmentation.

* Bugfix: SAProuter string handling
  When trying to establish a connection to an ABAP system, which is configured
  to use load balancing and the connection shall be established via a SAProuter,
  an exception occurred without any detail message.

* Bugfix: WCF service support
  If the .NET application runs as a WCF Service, the initialization of NCo
  aborted with the exception
    "Could not initialize configuration:
    System.ArgumentException: exePath must be specified when not running inside
    a stand alone exe.
       at System.Configuration.ConfigurationManager.OpenExeConfigurationImpl
            (ConfigurationFileMap fileMap, Boolean isMachine,
             ConfigurationUserLevel userLevel, String exePath)
       at System.Configuration.ConfigurationManager.OpenExeConfiguration
            (ConfigurationUserLevel userLevel)
       at SAP.Middleware.Connector.RfcConfigParameters..cctor()"
  This happened, because within a WCF Service, the application configuration needs
  to be looked up differently, even differently compared to ASP .NET where
  typically a HttpContext is available, which is not the case for WCF.
  Hence, NCo did not recognize to run within a WCF Service context, and therefore
  could not look up the application configuration. Now, NCo checks whether a
  VirtualPathExtension exists, assumes in this case to run within a WCF Service,
  and opens the web configuration using the virtual path.
  *Note:* the solution for this problem is available only in the .NET 4.0 variant
  of NCo 3.0.4. If you are using the .NET Framework 2.0, you can, as a workaround,
  add the following parameter to the configuration of your WCF Service:
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  </system.serviceModel>

* Bugfix: function serialization
  Invoking function modules involving bASXML may incur a RfcSerializationException
  or other kinds of exceptions in conjunction with a RABAX on the ABAP side, if
  the exchanged data amount was exceeding a certain (rather small) threshold.
  The basXML parser and renderer were fixed to deal with larger amounts of data
  correctly.

* Enhancement: tracing
  RFC trace can now be activated by setting the environment variable RFC_TRACE.
  Valid values are the same as for the app.config parameter "defaultTraceLevel":
  see section "General Configuration Parameters" in Appendix A of the NCo
  Programming Guide.

* Enhancement: Delta management
  Support for delta management for table parameters has been introduced for client
  communication. Thus, the performance is improved dramatically for certain use
  cases, in particular if the table sent to the ABAP system is hardly modified or
  not at all.

* Enhancement: Support for special destination "BACK".
  "BACK" is only usable within a NCo server function and allows to execute a
  function module in the context of the caller and simply re-uses the connection
  over which the server function has been received. The newly introduced constant
  RfcDestination.BACK can be used to retrieve the destination object instance.

* Enhancement: Supportability
  A default passport handler has been introduced to be used in connection with
  Wily (code instrumentation). If Wily is installed and enabled (environment
  variable Cor_Enable_Profiling=0x1) and no passport handler was set by the
  application, the Wily-specific passport handler is active and reads a passport
  from the thread local data slot named "SAP-PASSPORT-OUTBOUND" (if available),
  making it available through IRfcClientPassportHandler.OnCallStart. Conversely,
  IRfcClientPassportHandler.OnCallEnd puts the passport into the named data slot
  "SAP-PASSPORT-OUTBOUND-LASTUSED".

--------------------------------------------------------------------------------
Release Notes 3.0.3
* Bugfix: IMPORTING/EXPORTING parameter handling
  Older ABAP releases allow IMPORTING and EXPORTING parameters with the same name,
  thus emulating CHANGING parameters. However, NCo threw an
  RfcInvalidParameterException in such a case, because it did not did not accept
  duplicate parameter names. Now, such situations are treated like a single
  CHANGING parameter.

* Bugfix: server function runtime
  When trying to use the repository inside a server function implementation via
  RfcServerContext.Repository, the program crashed with a
  System.StackOverflowException. The property has been fixed not to refer to
  itself again.

* Bugfix: Exception handling
  If one or more logon parameters were missing when trying to connect to a SAP
  ABAP system, an RfcAbapRuntimeException instead of an RfcLogonException is thrown.

* Bugfix: Server tracing
  RFC servers always used the global trace level, not the server-specific trace
  level defined in the corresponding configuration parameters.

* Enhancement: initial values for fields
  An RfcTypeConversionException was thrown when trying to set a byte array
  consisting of "zeroes only" to a BCD or NUM field, as this value was considered
  invalid. However, it can be seen as valid initial value, and therefore NCo
  now accepts it as one.

* Bugfix: destination configuration - timeouts
  When using the destination configuration parameters IdleTimeout/IDLE_TIMEOUT
  or IdleCheckTime/IDLE_CHECK_TIME, it seemed as if random values were used
  for them. This happened, because they had accidentally been treated as global
  parameters instead of as per-destination parameters. Thus, all destinations
  had been using the parameters of the destination that had been adjusted last.
  Moreover, when using IdleCheckTime/IDLE_CHECK_TIME a NullReferenceException
  could occur. Now, this has been corrected.

* Bugfix: compression
  When sending very large IDocs to an NCo Server, an exception like
  "RfcSerializationException: End mark of RFCID.######## not found." was
  occurring. Examples for ####### were "TableContLZ (0x0305)",
  "NotUsed (0x0000)", or  "XMLData (0x3C05)". NCo's decompression logic was
  redesigned to avoid these situations.

* Bugfix: RfcServer state
  When an RfcServer received an RfcCommunicationException with the information
  that the connection to partner is broken, because the network connection to
  the gateway was lost, and this happened for all existing connections,
  the server state remained "Running", instead of turning its state to "Broken".
  After the network was available again, the server connection did still no
  longer work. The server state changes and restart mechanism were adjusted to
  recognized such situations. Now, it is recognized when all connections are
  dead, and the state is changed to "Broken". This is logged as an info message
  in dev_nco_rfc.log. Another log entry is written as soon as the server has
  recovered and returned to state "Running" again.

* Enhancement: Tracing
  The bgRFC Unit IDs in NCo traces and the ones available in bgRFC monitors on
  ABAP side did not match. Nevertheless, bgRFC worked fine as this was only
  caused by the difference how the Unit IDs were traces on both ends. Now,
  the traced unit IDs match.

* Enhancement: Data Binding
  DataBinding support for structured types. Find more details in the programming
  guide in chapter "Using Data Binding in Windows Forms"

* Enhancement: new API methods
  - new constructors for RfcAbapRuntimeException and RfcAbapMessageException.
  - property TraceLevel in RfcServer class.
  - method SetDestination() in RfcCustomRepository class.
  Find details in the API documentation.

--------------------------------------------------------------------------------
Release Notes 3.0.2
* Enhancement: support for bgRFC units
  bgRFC support is introduced with NCo 3.0.2. Check the API documentation for
  details.

* Enhancement: codepage converters
  Using special SAP codepages, such as blended codepages, did not work: An error
  message like "Invalid SAP Codepage 6110" was displayed. For other codepages
  the SAP special characters had been destroyed during conversion. This happened
  because Blended codepages (Starting with a 6 in the 4-digit name, e.g. 6110)
  are not supported by the standard codepage converters of .NET. The same is
  true for SAP special characters. SAP-specific codepages are now supported by
  integrating SAP codepage converters. Through an additional configuration
  parameter - RfcConfigParameters.UseSAPCodepages (USE_SAP_CODEPAGES) - a list
  of codepages can be specified for which SAP converters are employed instead
  of the .NET converters. Check the API documentation for details.

* Bugfix: server configuration events processing corrected
  Despite updating a server configuration and firing a change event an affected
  (running) server did not react properly and did not adjust itself
  automatically as expected due to a bug in event processing.

* Bugfix: stateful server behavior
  After setting all connections of a server to stateful the server could no
  longer be reached by additional clients. Establishing the connection timed
  out even though the RfcServer program was only idling, because the server
  did not start additional stateless connections if a server connection got
  stateful. Thus, all connections were blocked. Now, the RfcServer opens
  additional stateless connections for every server connection that turns
  stateful. The maximal number of additional connections is limited by the
  new configuration parameter RfcConfigParameters.MaxRegistrationCount
  (MAX_REG_COUNT).
  See API documentation for details.

* Bugfix: server exception handling
  Whenever a server function threw a "good" ABAP exception the server
  connection hung, because it did not enter the correct state so that
  processing could not continue properly.

* Bugfix: special time and date values
  The time value 24:00:00 considered valid by ABAP was rejected by NCo 3.0.
  The same was true for a few other peculiar ABAP date and time values. Now,
  those values are accepted as valid.

--------------------------------------------------------------------------------
Release Notes 3.0.1
* Bugfix: runtime initialization
  In certain client scenarios a problem in the initialization order of the
  .NET framework leads to the .NET Connector being unable to login to the
  SAP system. (Error message "invalid user or password", even though the
  credentials are ok.)

* Bugfix: codepage assignment 1100
  Codepage 1100 is now mapped to ISO-Latin-1 instead of Cp1252.

* Bugfix: compression
  In a long-running process, which is sending/receiving many calls with
  compressed tables, the calls may fail with an RfcSerializationException.

* Enhancement: server configuration RfcConfigParameters.SystemIDs, SYS_IDS
  The server configuration now contains a new property allowing to restrict
  access to this server to a certain selection of SAP backend systems
  identified by Sys-ID. See property "RfcConfigParameters.SystemIDs".

* Enhancement: Dedicated .NET 4.0 variant
  Support for Microsoft .NET Framework 4.0. a dedicated NCo 3.0 version for
  .NET 4.0 is now available for download

--------------------------------------------------------------------------------

Release Notes 3.0
SAP .NET Connector 3.0 brings a complete redesign of the NCo API and a new
architecture that also requires some redesign of the applications using NCo.
But as you will learn when getting more used to it, it is worth redesigning
your applications so that they can use the new .NET Connector 3.0.
The redesign of NCo is the result of a long experience with NCo 2.0 as well
as with SAP Java Connector 2.1 and 3.0.
In particular, important improvements are:
* NCo 3.0 is more stable, robust, and more secure
* It enforces a better design of your application by decoupling the
  connection handling from the .NET application proper
* It encourages separation of concerns: infrastructure embedding is clearly
  separated from business application logic
* NCo 3.0 reduces memory consumption at runtime
* It Allows dynamic programming without the need for proxy generation
* It can dynamically look up metadata (so if something changes in the
  related ABAP system - e.g. if parameters in a function module signature
  are added or the ABAP system is switched from Non-Unicode to Unicode, you
  no longer need to regenerate the proxies and recompile your solution)
* NCo 3.0 is no longer bound to a special Visual Studio version.

NCo 3.0 also adds some more features:
* Full BgRFC support, the successor of tRFC/qRFC
* Support for bASXML serialization in protocol
* Monitoring APIs
* Support for DECFLOAT data types
* Support for ABAP condition "IS SUPPLIED"
--------------------------------------------------------------------------------

Copyright  2010-2018 SAP SE. All Rights Reserved.

