3

私はC#(VS2010).Net(4.0)でのプログラミングに不慣れで、すでに数日以来、自分で解決できないことに遭遇しています。

C#コードで外部スクリプト言語(Lua)を使用しています。

そのために、.Net4.0用に構築されたLuaInterpreterを使用します

最初の試行:プロジェクトはコンソールアプリケーションです-> Luaクラスを呼び出そうとすると、プログラムは正常に動作します。

2回目の試行:プロジェクトは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.Net4.0を入手する必要があり ます

2-プロジェクトの参照としてLuaInterfaceを追加します

3-構築ディレクトリにLua51DLLをコピーします(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

署名されているように見えるので、Lua51 を GAC に入れてみて、動作するかどうかを確認してください。おそらく、Lua15.dll を excel.exe と同じパスに入れても試すことができます。

于 2011-07-28T09:51:26.017 に答える
0

64 ビット マシンでの .NET、LuaInterface、および Lua5.1 の相互作用で多くの問題が発生しました。Lua5.1 は 32 ビットのみをコンパイルするため、LuaInterface プロジェクトも 32 ビットとしてビルドする必要があります (私は信じています)。.NET プロジェクトで "Project -> Properties -> Build -> Platform Target" を "x86" に変更してみてください。

于 2011-08-01T16:00:25.573 に答える