I have this c# interface:
int EditActuateConfigFile([In, MarshalAs(UnmanagedType.LPStr)] string s);
and I call it from C++ with a char * - it compiles, at runtime there is no
complaint, but I put logging in the method and it isn't being called.
If I have an int argument or no arguments, the logging occurs.
I am writing a C++ Custom Action for an MSI install and have a C# DLL with
methods I need to call ...
// Class1.cs
// A simple managed DLL that contains a method to add two numbers.
using System;
using System.IO;
using System.Configuration;
using System.Diagnostics;
using System.Runtime.InteropServices;
using log4net;
using log4net.Config;
[assembly: log4net.Config.XmlConfigurator()]
namespace ManagedDLL
{
// Interface declaration.
public interface IConfigureActuateXml
{
int Edit();
int EditActuateConfigFile([In, MarshalAs(UnmanagedType.LPStr)] string s);
};
// Interface implementation.
public class ManagedClass:IConfigureActuateXml
{
private static readonly ILog log = LogManager.GetLogger("ManagedClass");
public int EditActuateConfigFile()
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(n ew
FileInfo("/tmp/owen.config"));
log.Info("In EditActuateConfigFile, s = " + s);
return 0;
}
public int Edit()
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(n ew
FileInfo("/tmp/owen.config"));
log.Info("In Edit");
return 1;
}
}
}
The C++ calling it (if I call edit() everything works):
long status = 0;
char *tempDirName;
status = getTempDir(hInstall, tempDirName);
if (status != ERROR_SUCCESS) return status;
// Create the interface pointer.
IConfigureActuateXmlPtr pIConfig(__uuidof(ManagedClass));
long lResult;
pIConfig->EditActuateConfigFile(tempDirName, &lResult);
fprintf(fp, "returned from calling EditActuateConfigFile. lResult = %ld\n",
lResult);