marshall directive exception

From: Skybuck Flying (nospam_at_hotmail.com)
Date: 08/27/04


Date: Fri, 27 Aug 2004 04:47:25 +0200

Now that everything uses AnsiString... the project produces a marshall
directive exception

I also had to create library2 since library1 was apparently locked.

It's better this way anyway ;)

library Library2;

{$UNSAFECODE ON}

{%DelphiDotNetAssemblyCompiler 'c:\program files\common files8\borland
shared\bds\shared assemblies\2.0\Borland.Delphi.dll'}

uses
  SysUtils,
  Classes,
  System.Reflection;

[assembly: AssemblyTitle('')]
[assembly: AssemblyDescription('')]
[assembly: AssemblyConfiguration('')]
[assembly: AssemblyCompany('')]
[assembly: AssemblyProduct('')]
[assembly: AssemblyCopyright('')]
[assembly: AssemblyTrademark('')]
[assembly: AssemblyCulture('')]

//
// Version information for an assembly consists of the following four
values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build
Numbers
// by using the '*' as shown below:

[assembly: AssemblyVersion('1.0.*')]

//
// In order to sign your assembly you must specify a key to use. Refer to
the
// Microsoft .NET Framework documentation for more information on assembly
signing.
//
// Use the attributes below to control which key is used for signing.
//
// Notes:
// (*) If no key is specified, the assembly is not signed.
// (*) KeyName refers to a key that has been installed in the Crypto
Service
// Provider (CSP) on your machine. KeyFile refers to a file which
contains
// a key.
// (*) If the KeyFile and the KeyName values are both specified, the
// following processing occurs:
// (1) If the KeyName can be found in the CSP, that key is used.
// (2) If the KeyName does not exist and the KeyFile does exist, the
key
// in the KeyFile is installed into the CSP and used.
// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name)
utility.
// When specifying the KeyFile, the location of the KeyFile should be
// relative to the project output directory. For example, if your
KeyFile is
// located in the project directory, you would specify the
AssemblyKeyFile
// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided
your output
// directory is the project directory (the default).
// (*) Delay Signing is an advanced option - see the Microsoft .NET
Framework
// documentation for more information on this.
//
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile('')]
[assembly: AssemblyKeyName('')]

function test_function_integer : integer;
begin
 result := 12345;
end;

function test_function_string : ansistring;
begin
 result := 'test string 1';
end;

procedure test_procedure_integer( var a : integer );
begin
 a := 54321;
end;

procedure test_procedure_string( var s : ansistring );
begin
 s := 'test string 2'
end;

exports
 test_function_string,
 test_function_integer,
 test_procedure_string,
 test_procedure_integer;

begin
end.

program Project2;

{$APPTYPE CONSOLE}

{%DelphiDotNetAssemblyCompiler 'Library2.dll'}

uses
  SysUtils,
  Library2;

function test_function_string : ansistring; external 'Library2';
function test_function_integer : integer; external 'Library2';

procedure test_procedure_integer( var a : integer ); external 'Library2';
procedure test_procedure_string( var s : ansistring ); external 'Library2';

var
 a : integer;
 s : ansistring;
begin

 writeln( test_function_integer );
 readln;

 test_procedure_integer( a );
 writeln( a );
 readln;

 test_procedure_string( s ); // now I get a marshall directive exception
        // can not marshal parameter #1
 writeln( s );
 readln;

 s := test_function_string;
 writeln( s );
 readln;

end.