私は、ユーザーの数学的モデルを構築し、異なる形式で出力するプロジェクトに取り組んでいます。今は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);