我在这个问题上挠头。我使用Excel DNA构建了一个插件体系结构,我想在运行时编译新功能并将其注册到Excel DNA中。 在我尝试在新函数上下文中访问静态数据之前,它工作得很好。我的静态数据Toto为空。
添加一些日志时,我发现RuntimeCompiler的静态构造函数被调用了两次。 似乎新功能正在不同的内存空间中运行。但是,当我在函数内部和外部登录Appdomain ID时,似乎是相同的。
该代码在单元测试中运行良好。所以这就是为什么我认为它与Excel / Excel DNA内存管理有关。
如何与新加载的函数共享相同的内存空间?
任何人都已遇到此问题。 ?
非常感谢
alpaga
namespace test.xl.Loader
{
public static class RuntimeCompiler
{
public static string Toto { get; set; }
public static void CreateAndRegisterFunctions()
{
try
{
var wrapperClassPath = CreateWrapperClassFromServiceDefinition();
if (wrapperClassPath == null) return;
var assemblyPath = CompileExecutable(wrapperClassPath);
if (assemblyPath == null) return;
var methodsToRegister = GetMethodsFromAssembly(assemblyPath);
if (methodsToRegister == null) return;
ExcelAsyncUtil.QueueAsMacro(() => Integration.RegisterMethods(methodsToRegister));
}
catch (Exception e)
{
_logger.ErrorFormat(e.Message);
}
}
private static string CreateWrapperClassFromServiceDefinition()
{
try
{
Toto = "lol";
var generatedClass = @"
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using test.xl.Loader;
namespace A
{
public class Wrapper
{
public static object FlGetToto(string arg)
{
return test.xl.Loader.RuntimeCompiler.Toto;
}
}
}
";
var tmp = Path.GetTempFileName()+".cs";
using (var file = new StreamWriter(tmp))
{
file.Write(generatedClass);
}
return tmp;
}
catch (Exception e)
{
_logger.Error($"Fail while creating Wrapper Class : {e.Message}");
return null;
}
}
private static List<MethodInfo> GetMethodsFromAssembly(string assemblyPath)
{
try
{
var dllName = Path.GetFileName(assemblyPath);
var assemblyFullName = AssemblyName.GetAssemblyName($".\\ {dllName}");
var assembly = Assembly.Load(assemblyFullName);
AppDomain.CurrentDomain.Load(assembly.GetName());
Type myType = assembly.GetType("A.Wrapper");
return myType.GetMethods().ToList().Where(x => x.Module.Name == dllName).ToList();
}
catch (Exception e)
{
_logger.Error($"Fail while getting methods from Assembly : {e.Message}");
return null;
}
}
}
}