C#外部库(Lua)调用问题

时间:2011-07-28 09:33:04

标签: c# .net-4.0 lua excel-2007 luainterface

我是C#(VS2010).Net(4.0)编程的新手,而且我遇到了自从几天以来我自己无法解决的问题。

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

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

首先尝试: 该项目是一个控制台应用程序 - >当我尝试调用Lua类时,程序运行正常。

第二次尝试: 该项目是一个从Excel使用的类Librrary 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-您需要从中获取LuaInterface .Net 4.0 http://www.mdome.org/2011/05/16/luainterface-for-csharp-net-4-custom-build/

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调用时的测试功能

我会对此提供任何帮助 感谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我在.NET,LuaInterface和Lua5.1上在64位计算机上进行交互时遇到了很多问题。 Lua5.1只编译32位,这要求你(我相信)将LuaInterface项目构建为32位。尝试在.NET项目中将“Project - > Properties - > Build - > Platform Target”更改为“x86”。