3

我是 C# (VS2010) .Net (4.0) 编程的新手,我遇到了我自己无法解决的问题,因为已经有几天了。

我在我的 C# 代码中使用了外部脚本语言 (Lua)。

为此,我使用为 .Net 4.0 构建的 LuaInterpreter

第一次尝试:该项目是一个控制台应用程序->当我尝试调用 Lua 类时程序运行良好。

第二次尝试:该项目是 Excel 中使用的类库 COM -> 类库编译良好,我的用户定义函数在 Excel 中工作正常。但是当我试图调用一个 Lua 类时,它崩溃了,说 Lua 程序集丢失了。

Could not load file or assembly 'lua51, Version=0.0.0.0, Culture=neutral, PublicKeyToken=1e1fb15b02227b8a' or one of its dependencies. Strong name validation failed. (Exception from HRESULT: 0x8013141A)

重现问题:

1-您需要从 http://www.mdome.org/2011/05/16/luainterface-for-csharp-net-4-custom-build/获取 LuaInterface .Net 4.0

2-在项目中添加 LuaInterface 作为参考

3- 将 Lua51 DLL 复制到构建目录中(我也把我的 Excel 表放在那里)

4-复制类库的代码

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using Excel = Microsoft.Office.Interop.Excel;
using LuaInterface;

namespace POC
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class Functions
    {
        public int test()
        {
            Lua lua = new Lua();
            return 0;
        }

        #region Class in Excel
        [ComRegisterFunctionAttribute]
        public static void RegisterFunction(Type type)
        {
            Registry.ClassesRoot.CreateSubKey(
              GetSubKeyName(type, "Programmable"));
            RegistryKey key = Registry.ClassesRoot.OpenSubKey(
              GetSubKeyName(type, "InprocServer32"), true);
            key.SetValue("",
              System.Environment.SystemDirectory + @"\mscoree.dll",
              RegistryValueKind.String);
        }

        [ComUnregisterFunctionAttribute]
        public static void UnregisterFunction(Type type)
        {
            Registry.ClassesRoot.DeleteSubKey(
              GetSubKeyName(type, "Programmable"), false);
        }

        private static string GetSubKeyName(Type type,
          string subKeyName)
        {
            System.Text.StringBuilder s =
              new System.Text.StringBuilder();
            s.Append(@"CLSID\{");
            s.Append(type.GUID.ToString().ToUpper());
            s.Append(@"}\");
            s.Append(subKeyName);
            return s.ToString();
        }
        #endregion
    }
}

崩溃的函数是从 Excel 调用时的测试函数

我会为此提供任何帮助谢谢

4

2 回答 2

0

我在 .NET、LuaInterface 和 Lua5.1 在 64 位机器上交互时遇到了很多问题。Lua5.1 只编译 32 位,这需要你(我相信)将 LuaInterface 项目构建为 32 位。尝试在您的 .NET 项目中将“项目 -> 属性 -> 构建 -> 平台目标”更改为“x86”。

于 2011-08-01T16:00:25.573 回答
0

既然它似乎已经签名,请尝试将 Lua51 放入 GAC 并查看它是否有效。也许您甚至可以尝试将 Lua15.dll 放在与 excel.exe 相同的路径中。

于 2011-07-28T09:51:26.017 回答