Проблема вызова внешней библиотеки C # (Lua) - PullRequest
3 голосов
/ 28 июля 2011

Я новичок в программировании на C # (VS2010) .Net (4.0), и я столкнулся, что не могу решить сам, так как уже несколько дней.

Я использую внешний язык сценариев(Lua) в моем коде C #.

. Для этого я использую LuaInterpreter, созданный для .Net 4.0

Первая попытка: проект представляет собой консольное приложение -> программа работает нормально, когда я пытаюсьвызовите класс Lua.

Вторая попытка: проект представляет собой класс Librrary COM, используемый в Excel -> Библиотека классов прекрасно компилируется, и мои пользовательские функции работают отлично в 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- Скопируйте DLL-библиотеку Lua51 в каталог здания (я тоже положил туда свой лист 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 голосов
/ 01 августа 2011

У меня было много проблем с взаимодействием .NET, LuaInterface и Lua5.1 на 64-битных машинах. Lua5.1 компилирует только 32-битную версию, и для этого необходимо (я считаю) также построить проект LuaInterface как 32-битную версию. Попробуйте изменить "Project -> Properties -> Build -> Platform Target" на "x86" в своих проектах .NET.

0 голосов
/ 28 июля 2011

Поскольку он, кажется, подписан, попробуйте поместить Lua51 в GAC и посмотреть, работает ли он.Вероятно, вы можете попробовать даже, поместив Lua15.dll в тот же путь Excel.exe.

...