私は、ベンダーが提供する 3 つの ole com ライブラリを持っています。これらは、異なるが類似したデバイスへのインターフェイスを提供します。これらのライブラリはデバイス間で互換性がなく、さまざまな機能が組み込まれています。また、それらはすべて同じ ID を共有しているため、一度に 1 つのマシンにしか登録できません。残念ながら、私はソースを持っておらず、これらを再コンパイルする方法がありません。
私の問題は、多くの場合、複数のモデルのデバイスと通信できる必要があることです。
特定のパスからdllをロードしてアセンブリに変換し、そのインスタンスを作成して、必要な関数のメソッド情報を引き出してみました。これはうまくいくようです。タイプ情報は予想どおりライブラリごとに異なりますが、インスタンス化するたびに、現在登録されている dll にない関数を呼び出すとアクセス違反でクラッシュして書き込みが発生するため、登録されている dll のみをロードするように見えます。誰にもアイデアはありますか?
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
public static extern void LoadTypeLibEx(String strTypeLibName, RegKind regKind, [MarshalAs(UnmanagedType.Interface)] out Object typeLib);
public enum RegKind
{
RegKind_Default = 0,
RegKind_Register = 1,
RegKind_None = 2
}
private void Initialize() {
Type ct;
object typeLib;
try {
// Load DLL
LoadTypeLibEx(@"c:\temp\zkA11C\zkemkeeper.dll", RegKind.RegKind_None, out typeLib);
if (typeLib == null)
throw new Exception("LoadTypeLibEx returned null pointer");
TypeLibConverter converter = new TypeLibConverter();
ConversionEventHandler eventHandler = new ConversionEventHandler();
AssemblyBuilder zkA11C = converter.ConvertTypeLibToAssembly(typeLib, "zkA11C.dll", 0, eventHandler, null, null, null, null);
// Get class type
ct = zkA11C.GetType("zkA11C.CZKEMClass");
// Create instance of the class
dllClassInstance = Activator.CreateInstance(ct);
// Get method info for functions
fmiConnect = ct.GetMethod("Connect_Net");
...
}
catch (Exception e) {
throw new Exception("Failed to load library: " + e.Message);
}
}