2011-07-28 15 views
3

私はC#(VS2010).Net(4.0)でプログラミングするのが初めてで、何日か前から自分で解決できないことに遭遇しています。C#外部ライブラリ(Lua)呼び出し問題

私はC#コードで外部スクリプト言語(Lua)を使用しています。 - 私はLuaのクラスを呼び出すしようとすると、>プログラムが正常に動作します プロジェクトは、コンソールアプリケーションです:私はLuaInterpreterは.NET 4.0

最初の試みのために構築された使用行うに

2回目の試行: プロジェクトは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) 

問題を再現するには:あなたは http://www.mdome.org/2011/05/16/luainterface-for-csharp-net-4-custom-build/

2- LuaInterface .NET 4.0を取得する必要があります

1-プロジェクトに参照

、3-コピーとしてLuaInterfaceを追加します。ビルのディレクトリにある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 
    } 
} 

墜落した機能、それが署名しているように見えるので、私はその おかげ

答えて

0

上の任意の助けを取るエクセル

から呼び出されたときにテスト関数である、にLua51を入れてみてくださいGACとそれが動作するかどうかを確認します。おそらく、excel.exeの同じパスにLua15.dllを置いてみることもできます。

+0

アドバイスをいただきありがとうございます。 gacutilが「不明なエラー」と言って失敗したため、DLLをGACに入れることができませんでした。 dllをExcel.exeディレクトリに入れるのは問題ありません。これは、DLLとプログラムが正常に動作することを証明しますが、それは長期的な解決策ではありません... 私はクラスを呼び出すと、DLLが検索されるフォルダを追跡する方法を知っていますか? 視覚化するには:Excel - >ユーザーDLL(私のアセンブリ) - > LuaInterface.dll - > Lua51.dll Excelディレクトリにある必要があるものはLua51.dllです –

0

私は64ビットマシンで.NET、LuaInterface、およびLua5.1を邪魔していました。 Lua5.1は32ビットしかコンパイルされません。これは32ビットとしてLuaInterfaceプロジェクトを構築する必要があります。あなたの.NETプロジェクトで "プロジェクト - >プロパティ - >ビルド - >プラットフォームターゲット"を "x86"に変更してみてください。

関連する問題