3

Registration Free COM を使用して Excel 2010 から .NET 呼び出しを行うのに苦労しています。基本的に、Excel マクロでいくつかの .NET API 関数を呼び出せるようにしたいと考えていました。.NET でラッパー API を作成し、そのラッパーを COM 呼び出し可能なライブラリとして公開しました。そのためのコードは次のとおりです。

Imports System
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.Assemblies

Namespace ExcelNXInterface

<Guid("bbe0089d-a732-4743-922b-180b30006fa4"), _
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface _ExcelNXInterface
    <DispId(1)> Sub HighlightCompTag(ByRef tag As Long)
    <DispId(2)> Sub Echo(ByVal output As String)
End Interface

<ComVisible(True)>
<Guid("1376DE24-CC2D-46cb-8BF0-887A9CAF3014"), _
 ClassInterface(ClassInterfaceType.None), _
 ProgId("ExcelNXInterface.ExcelNXInterface")> Public Class ExcelNXInterface
    Implements _ExcelNXInterface

    Public _ExcelNXInterface

    Dim theSession As Session = Session.GetSession()
    Dim ufs As UFSession = UFSession.GetUFSession()

    Public Sub HighlightCompTag(ByRef tag As Long) Implements _ExcelNXInterface.HighlightCompTag

        Try
            ufs.Disp.SetHighlight(tag, 1)
            Echo("Component(s) Highlighted...")
        Catch e As NXException
            Echo("NX Exception is: {0} " + e.Message)
        Catch e As Exception
            Echo("Exception is: {0} " & e.Message)
            Echo("DONE!" & vbLf)
        End Try

    End Sub

    Sub Echo(ByVal output As String) Implements _ExcelNXInterface.Echo

        theSession.ListingWindow.Open()
        theSession.ListingWindow.WriteLine(output)
        theSession.LogFile.WriteLine(output)

    End Sub

End Class

End Namespace

Registration Free COM を使用するためのマニフェストは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly 
  manifestVersion="1.0" 
  xmlns="urn:schemas-microsoft-com:asm.v1" 
  xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
  xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <assemblyIdentity
    type="win32"
    version="1.0.0.0" 
    name="ExcelNXInterface"/>

  <clrClass
      clsid="{bbe0089d-a732-4743-922b-180b30006fa4}"
      progid="ExcelNXInterface.ExcelNXInterface"
      threadingModel="Both"
      name="ExcelNXInterface.ExcelNXInterface">
  </clrClass>

  <file name = "ExcelNXInterface.dll"></file>   
</asmv1:assembly>

Excel でラップされた .NET 関数を呼び出すには、次の VBA コードを使用しました。

Sub ExNX()
    Dim actCtx As Object
    Set actCtx = CreateObject("Microsoft.Windows.ActCtx")
    actCtx.Manifest = ThisWorkbook.Path & "\ExcelNXInterface.dll.manifest"

    Dim myNX As Object
    Set myNX = actCtx.CreateObject("ExcelNXInterface.ExcelNXInterface")

End Sub

ただし、問題は、コードの最後の行が呼び出されると、実行時エラー 2147024894 (80070002) Method 'CreatObject' of object IActCtx' failed. が発生することです。正直なところ、自分が間違っていることが何であるか、またはこれが可能であるかどうかさえわかりません。どんな助けや提案も大歓迎です。

DLL、マニフェスト、ワークブックはすべて同じディレクトリにあることに注意してください。また、VSTO、実行可能ファイル、および/またはインストールはオプションではないことに注意してください。そのため、Excel を使用することに固執しようとしています。

4

0 に答える 0