Вызов управляемого кода из Access 2003 - PullRequest
2 голосов
/ 10 февраля 2009

Кросс опубликован на access-programmers.co.uk

Пожалуйста, размещайте ответы на этом форуме можно ..

Я собрал dll в c # 3.5 .., где я установил свойства решения, чтобы зарегистрировать сборку для взаимодействия COM.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace SBG_TestWithVBA
{
  [ClassInterface(ClassInterfaceType.AutoDual)]

  public class TestHello
  {
    [ComVisible(true)]

    public string SayHello(string name)
    {
      string message = "Hello " + name;
      return message;
    }
    public string HelloWorld()
    {
      string message = "Hello World!";
      return message;
    }
  }
}

Затем я зарегистрировал сборку и файл tlb, используя

"C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ regasm.exe" "\ sbgfs01 \ users \ Vincent Pirolli \ Мои документы \ Visual Studio 2008 \ Проекты \ TestWithVBA \ TestWithVBA \ bin \ Release \ SBG_TestWithVBA .dll "/ tlb:" \ sbgfs01 \ users \ Винсент Пиролли \ Мои документы \ Visual Studio 2008 \ Проекты \ TestWithVBA \ TestWithVBA \ bin \ Release \ SBG_TestWithVBA.tlb "

Затем я добавляю файл tlb в vba из меню инструментов> ссылок ..

и мой код VBA выглядит следующим образом:

Sub test()
    Dim f As SBG_TestWithVBA
    Set f = New SBG_TestWithVBA
    f.HelloWorld
End Sub

Я получаю следующую ошибку, хотя Intellisense работает в редакторе VBA: "Ошибка автоматизации Система не может найти указанный файл. "

У кого-нибудь есть идеи? У меня есть статьи в предыдущих постах, но я не могу найти решение.


хорошо, это действительно раздражает меня сейчас ..

мне удалось заставить это работать .. но я не понимаю, почему ..

В свойствах решения в пределах Visual Studio .. на вкладке «Сборка» я устанавливаю «Регистрация для взаимодействия COM» в значение «истина», а в «Приложении> Информация о сборке» я устанавливаю «Сделать сборку видимой» = ИСТИНА.

У меня есть файлы проекта VS на общем диске. Теперь, если я устанавливаю расположение сборки в папку bin на общем диске, в файлах моего проекта, когда я звоню из VBA, это не работает. Однако, если я устанавливаю папку сборки в папку на моем локальном диске C, то он отлично работает при звонке с VBA ..

Есть идеи?

Ответы [ 3 ]

1 голос
/ 10 февраля 2009

Похоже, что сборка, которую вы регистрируете, находится в сетевой папке. В случае сборок .net к ним применяется другая модель безопасности.

Вы пытались поместить сборку и TLB в локальный каталог, а затем добавить TLB в меню "Инструменты> Ссылки"?

Также - и это вполне может быть совершенно неприемлемым - но есть ли необходимость в регистрации DLL в RegSvr32, чтобы она была адресуемой?

0 голосов
/ 30 июля 2009

Если вы хотите узнать больше о безопасности .net, Google для CASPOL.EXE. CASPOL.EXE - это инструмент безопасности, который поставляется со всеми платформами .net. CASPOL расшифровывается как Code Acces Security POLicy. С помощью этого инструмента вы можете настроить политики на основе зон.

0 голосов
/ 08 июня 2009

Тот факт, что вы можете заставить его работать локально, но он не работает на общем сетевом ресурсе, указывает на проблему безопасности .NET. .NET относится к локальным ресурсам иначе, чем к сетевым ресурсам и отличается от доверенного Интернета и ненадежного Интернета. Я подозреваю, что ваши компоненты .NET настроены на доверие локальным сборкам, но не на сборки LocalIntranet.

См. Здесь требования к конфигурации для получения локальной интрасети и тому подобное:

http://support.microsoft.com/kb/892465

См. Этот ответ, чтобы узнать, в какой зоне пытается запустить сборка:

https://stackoverflow.com/questions/239463?sort=newest

В дополнение скажу, что я обнаружил, что настройка среды для целевого сетевого ресурса довольно сложна, поскольку многие предположения, которые делаются при работе с кодом на локальном компьютере, являются недопустимыми. По этой причине я предпочитаю устанавливать на локальный компьютер, где это возможно, и бороться с моделью безопасности только тогда, когда есть веская причина не устанавливать локально.

...