2012-03-20 6 views
0

私は、ユーザーの数学的モデルを構築し、異なる形式で出力するプロジェクトに取り組んでいます。今はPython、Java、C++での出力をサポートしています。これはうまくいく、私はコードを自動生成し、それを1日と呼ぶ。COMインターオペラ用DLLのランタイムコンパイル

ただし、新しいリクエストが行われました。ユーザーは、Excel内からモデルを使用できるようにする必要があります。私はいくつか検索して見つけたhttp://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/

これは良いスタートですが、私はこれをプログラムで行う必要があります。モデルは大きなプログラムにオブジェクトとして格納されます。ユーザーがExcel用のDLLとしてエクスポートすることを選択した場合は、定型コードを使用して、使用したいメソッドを挿入します。

しかし、COM Interopのコードを登録する必要があるようです。私のテストコードはC#を使用してそのメソッドにアクセスできるDLLを作成します。しかし、Excel 2000での参照を追加しようとすると(私は知っている、私は知っている、企業の吸盤)VBAは動作しません。 TLBファイルが作成されていないと思われるので、ロードするためのものはありません。

私は生成されたコードをスタンドアロンとしてコンパイルすると、COMの表示とCOMの相互運用機能のボックスをチェックすると、TLBが生成されますが、Excel VBAは自動化エラーをスローします。

実際の質問です。

1)実行時に、COM相互参照用に表示および再登録されたDLLを作成するにはどうすればよいですか?

2)どのようにしてExcelをうまく演奏させることができますか?

簡単な例DLLのコードは次のとおりです。DLLを構築するために

using System; 
using System.Runtime.InteropServices; 

namespace VSN 
{ 

    [ComVisibleAttribute(true)] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class VSNFunctions 
    { 
     public VSNFunctions() 
     { 
     } 

     /// <summary> 
     /// Adds 2 variables together. 
     /// </summary> 
     /// <param name=\"v1\">First Param</param> 
     /// <param name=\"v2\">Second Param</param> 
     /// <returns>Sum of v1 and v2</returns> 
     public double Add2(double v1, double v2) 
     { 
      return v1 + v2; 
     } 
     public double Sub2(double v1, double v2) 
     { 
      return v1 - v2; 
     } 
     public double Mul2(double v1, double v2) 
     { 
      return v1 * v2; 
     } 
     public double div2(double v1, double v2) 
     { 
      return v1/v2; 
     } 

     [ComRegisterFunctionAttribute] 
     public static void RegisterFunction(Type t) 
     { 
      Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{"+t.GUID.ToString().ToUpper() + "}\\Programmable"); 
     } 


     [ComUnregisterFunctionAttribute] 
     public static void UnregisterFunction(Type t) 
     { 
      Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey("CLSID\\{"+t.GUID.ToString().ToUpper() + "}\\Programmable"); 
     } 
    } 
} 

コードprogrammitcally従う:

CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp"); 
CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
String exeName = String.Format(@"{0}\{1}.dll", System.Environment.CurrentDirectory, "VSNTest"); 
MessageBox.Show(exeName); 
parameters.OutputAssembly = exeName; 

parameters.CompilerOptions = "/optimize"; 

CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, DLLString); 

答えて

0

How to: Expose Code to VBA in a Visual C# Project

をVisual C#プロジェクトでコードを呼び出すためにVBAコードを有効にするには、 COMに表示されるようにコードを変更し、デザイナでReferenceAssemblyFromVbaProjectプロパティをTrueに設定します。

関連する問題